//===----------------------------------------------------------------------===//
//
// This source file is part of the Soto for AWS open source project
//
// Copyright (c) 2017-2022 the Soto project authors
// Licensed under Apache License v2.0
//
// See LICENSE.txt for license information
// See CONTRIBUTORS.txt for the list of Soto project authors
//
// SPDX-License-Identifier: Apache-2.0
//
//===----------------------------------------------------------------------===//

// THIS FILE IS AUTOMATICALLY GENERATED by https://github.com/soto-project/soto-codegenerator.
// DO NOT EDIT.

import Foundation
import SotoCore

extension DocDB {
    // MARK: Enums

    public enum ApplyMethod: String, CustomStringConvertible, Codable, _SotoSendable {
        case immediate
        case pendingReboot = "pending-reboot"
        public var description: String { return self.rawValue }
    }

    public enum SourceType: String, CustomStringConvertible, Codable, _SotoSendable {
        case dbCluster = "db-cluster"
        case dbClusterSnapshot = "db-cluster-snapshot"
        case dbInstance = "db-instance"
        case dbParameterGroup = "db-parameter-group"
        case dbSecurityGroup = "db-security-group"
        case dbSnapshot = "db-snapshot"
        public var description: String { return self.rawValue }
    }

    // MARK: Shapes

    public struct AddSourceIdentifierToSubscriptionMessage: AWSEncodableShape {
        /// The identifier of the event source to be added:   If the source type is an instance, a  DBInstanceIdentifier must be provided.   If the source type is a security group, a  DBSecurityGroupName must be provided.   If the source type is a parameter group, a DBParameterGroupName must be provided.   If the source type is a snapshot, a  DBSnapshotIdentifier must be provided.
        public let sourceIdentifier: String
        /// The name of the Amazon DocumentDB event notification subscription that you  want to add a source identifier to.
        public let subscriptionName: String

        public init(sourceIdentifier: String, subscriptionName: String) {
            self.sourceIdentifier = sourceIdentifier
            self.subscriptionName = subscriptionName
        }

        private enum CodingKeys: String, CodingKey {
            case sourceIdentifier = "SourceIdentifier"
            case subscriptionName = "SubscriptionName"
        }
    }

    public struct AddSourceIdentifierToSubscriptionResult: AWSDecodableShape {
        public let eventSubscription: EventSubscription?

        public init(eventSubscription: EventSubscription? = nil) {
            self.eventSubscription = eventSubscription
        }

        private enum CodingKeys: String, CodingKey {
            case eventSubscription = "EventSubscription"
        }
    }

    public struct AddTagsToResourceMessage: AWSEncodableShape {
        public struct _TagsEncoding: ArrayCoderProperties { public static let member = "Tag" }

        /// The Amazon DocumentDB resource that the tags are added to. This value is an Amazon Resource Name .
        public let resourceName: String
        /// The tags to be assigned to the Amazon DocumentDB resource.
        @CustomCoding<ArrayCoder<_TagsEncoding, Tag>>
        public var tags: [Tag]

        public init(resourceName: String, tags: [Tag]) {
            self.resourceName = resourceName
            self.tags = tags
        }

        private enum CodingKeys: String, CodingKey {
            case resourceName = "ResourceName"
            case tags = "Tags"
        }
    }

    public struct ApplyPendingMaintenanceActionMessage: AWSEncodableShape {
        /// The pending maintenance action to apply to this resource. Valid values: system-update, db-upgrade
        public let applyAction: String
        /// A value that specifies the type of opt-in request or undoes an  opt-in request. An opt-in request of type immediate  can't be undone. Valid values:    immediate - Apply the maintenance action  immediately.    next-maintenance - Apply the maintenance  action during the next maintenance window for the resource.     undo-opt-in - Cancel any existing  next-maintenance opt-in requests.
        public let optInType: String
        /// The Amazon Resource Name (ARN) of the resource that the pending  maintenance action applies to.
        public let resourceIdentifier: String

        public init(applyAction: String, optInType: String, resourceIdentifier: String) {
            self.applyAction = applyAction
            self.optInType = optInType
            self.resourceIdentifier = resourceIdentifier
        }

        private enum CodingKeys: String, CodingKey {
            case applyAction = "ApplyAction"
            case optInType = "OptInType"
            case resourceIdentifier = "ResourceIdentifier"
        }
    }

    public struct ApplyPendingMaintenanceActionResult: AWSDecodableShape {
        public let resourcePendingMaintenanceActions: ResourcePendingMaintenanceActions?

        public init(resourcePendingMaintenanceActions: ResourcePendingMaintenanceActions? = nil) {
            self.resourcePendingMaintenanceActions = resourcePendingMaintenanceActions
        }

        private enum CodingKeys: String, CodingKey {
            case resourcePendingMaintenanceActions = "ResourcePendingMaintenanceActions"
        }
    }

    public struct AvailabilityZone: AWSDecodableShape {
        /// The name of the Availability Zone.
        public let name: String?

        public init(name: String? = nil) {
            self.name = name
        }

        private enum CodingKeys: String, CodingKey {
            case name = "Name"
        }
    }

    public struct Certificate: AWSDecodableShape {
        /// The Amazon Resource Name (ARN) for the certificate. Example: arn:aws:rds:us-east-1::cert:rds-ca-2019
        public let certificateArn: String?
        /// The unique key that identifies a certificate. Example: rds-ca-2019
        public let certificateIdentifier: String?
        /// The type of the certificate. Example: CA
        public let certificateType: String?
        /// The thumbprint of the certificate.
        public let thumbprint: String?
        /// The starting date-time from which the certificate is valid. Example: 2019-07-31T17:57:09Z
        public let validFrom: Date?
        /// The date-time after which the certificate is no longer valid. Example: 2024-07-31T17:57:09Z
        public let validTill: Date?

        public init(certificateArn: String? = nil, certificateIdentifier: String? = nil, certificateType: String? = nil, thumbprint: String? = nil, validFrom: Date? = nil, validTill: Date? = nil) {
            self.certificateArn = certificateArn
            self.certificateIdentifier = certificateIdentifier
            self.certificateType = certificateType
            self.thumbprint = thumbprint
            self.validFrom = validFrom
            self.validTill = validTill
        }

        private enum CodingKeys: String, CodingKey {
            case certificateArn = "CertificateArn"
            case certificateIdentifier = "CertificateIdentifier"
            case certificateType = "CertificateType"
            case thumbprint = "Thumbprint"
            case validFrom = "ValidFrom"
            case validTill = "ValidTill"
        }
    }

    public struct CertificateMessage: AWSDecodableShape {
        public struct _CertificatesEncoding: ArrayCoderProperties { public static let member = "Certificate" }

        /// A list of certificates for this Amazon Web Services account.
        @OptionalCustomCoding<ArrayCoder<_CertificatesEncoding, Certificate>>
        public var certificates: [Certificate]?
        /// An optional pagination token provided if the number of records retrieved is greater than MaxRecords. If this parameter is specified, the marker specifies the next record in the list. Including the value of Marker in the next call to DescribeCertificates results in the next page of certificates.
        public let marker: String?

        public init(certificates: [Certificate]? = nil, marker: String? = nil) {
            self.certificates = certificates
            self.marker = marker
        }

        private enum CodingKeys: String, CodingKey {
            case certificates = "Certificates"
            case marker = "Marker"
        }
    }

    public struct CloudwatchLogsExportConfiguration: AWSEncodableShape {
        /// The list of log types to disable.
        @OptionalCustomCoding<StandardArrayCoder>
        public var disableLogTypes: [String]?
        /// The list of log types to enable.
        @OptionalCustomCoding<StandardArrayCoder>
        public var enableLogTypes: [String]?

        public init(disableLogTypes: [String]? = nil, enableLogTypes: [String]? = nil) {
            self.disableLogTypes = disableLogTypes
            self.enableLogTypes = enableLogTypes
        }

        private enum CodingKeys: String, CodingKey {
            case disableLogTypes = "DisableLogTypes"
            case enableLogTypes = "EnableLogTypes"
        }
    }

    public struct CopyDBClusterParameterGroupMessage: AWSEncodableShape {
        public struct _TagsEncoding: ArrayCoderProperties { public static let member = "Tag" }

        /// The identifier or Amazon Resource Name (ARN) for the source cluster parameter group. Constraints:   Must specify a valid cluster parameter group.   If the source cluster parameter group is in the same Amazon Web Services Region as the copy, specify a valid parameter group identifier; for example, my-db-cluster-param-group, or a valid ARN.   If the source parameter group is in a different Amazon Web Services Region than the copy, specify a valid cluster parameter group ARN; for example, arn:aws:rds:us-east-1:123456789012:sample-cluster:sample-parameter-group.
        public let sourceDBClusterParameterGroupIdentifier: String
        /// The tags that are to be assigned to the parameter group.
        @OptionalCustomCoding<ArrayCoder<_TagsEncoding, Tag>>
        public var tags: [Tag]?
        /// A description for the copied cluster parameter group.
        public let targetDBClusterParameterGroupDescription: String
        /// The identifier for the copied cluster parameter group. Constraints:   Cannot be null, empty, or blank.   Must contain from 1 to 255 letters, numbers, or hyphens.    The first character must be a letter.   Cannot end with a hyphen or contain two consecutive hyphens.    Example: my-cluster-param-group1
        public let targetDBClusterParameterGroupIdentifier: String

        public init(sourceDBClusterParameterGroupIdentifier: String, tags: [Tag]? = nil, targetDBClusterParameterGroupDescription: String, targetDBClusterParameterGroupIdentifier: String) {
            self.sourceDBClusterParameterGroupIdentifier = sourceDBClusterParameterGroupIdentifier
            self.tags = tags
            self.targetDBClusterParameterGroupDescription = targetDBClusterParameterGroupDescription
            self.targetDBClusterParameterGroupIdentifier = targetDBClusterParameterGroupIdentifier
        }

        private enum CodingKeys: String, CodingKey {
            case sourceDBClusterParameterGroupIdentifier = "SourceDBClusterParameterGroupIdentifier"
            case tags = "Tags"
            case targetDBClusterParameterGroupDescription = "TargetDBClusterParameterGroupDescription"
            case targetDBClusterParameterGroupIdentifier = "TargetDBClusterParameterGroupIdentifier"
        }
    }

    public struct CopyDBClusterParameterGroupResult: AWSDecodableShape {
        public let dbClusterParameterGroup: DBClusterParameterGroup?

        public init(dbClusterParameterGroup: DBClusterParameterGroup? = nil) {
            self.dbClusterParameterGroup = dbClusterParameterGroup
        }

        private enum CodingKeys: String, CodingKey {
            case dbClusterParameterGroup = "DBClusterParameterGroup"
        }
    }

    public struct CopyDBClusterSnapshotMessage: AWSEncodableShape {
        public struct _TagsEncoding: ArrayCoderProperties { public static let member = "Tag" }

        /// Set to true to copy all tags from the source cluster  snapshot to the target cluster snapshot, and otherwise  false. The default is false.
        public let copyTags: Bool?
        /// The KMS key ID for an encrypted cluster snapshot. The KMS key ID is the Amazon Resource Name (ARN), KMS key identifier, or the KMS key alias for the KMS encryption key.   If you copy an encrypted cluster snapshot from your Amazon Web Services account, you can specify a value for KmsKeyId to encrypt the copy with a new KMS encryption key. If you don't specify a value for KmsKeyId, then the copy of the cluster snapshot is encrypted with the same KMS key as the source cluster snapshot.  If you copy an encrypted cluster snapshot that is shared from another Amazon Web Services account, then you must specify a value for KmsKeyId.  To copy an encrypted cluster snapshot to another Amazon Web Services Region, set KmsKeyId to the KMS key ID that you want to use to encrypt the copy of the cluster snapshot in the destination Region. KMS encryption keys are specific to the Amazon Web Services Region that they are created in, and you can't use encryption keys from one Amazon Web Services Region in another Amazon Web Services Region.  If you copy an unencrypted cluster snapshot and specify a value for the KmsKeyId parameter, an error is returned.
        public let kmsKeyId: String?
        /// The URL that contains a Signature Version 4 signed request for theCopyDBClusterSnapshot API action in the Amazon Web Services Region that contains the source cluster snapshot to copy. You must use the PreSignedUrl parameter when copying a cluster snapshot from another Amazon Web Services Region.  If you are using an Amazon Web Services SDK tool or the CLI, you can specify  SourceRegion (or --source-region for the CLI) instead of specifying PreSignedUrl manually.  Specifying SourceRegion autogenerates a pre-signed URL  that is a valid request for the operation that can be executed in the source Amazon Web Services Region.  The presigned URL must be a valid request for the  CopyDBClusterSnapshot API action that can be executed  in the source Amazon Web Services Region that contains the cluster snapshot to be  copied. The presigned URL request must contain the following parameter values:    SourceRegion - The ID of the region that  contains the snapshot to be copied.    SourceDBClusterSnapshotIdentifier - The  identifier for the the encrypted cluster snapshot to be  copied. This identifier must be in the Amazon Resource Name (ARN) format for the source Amazon Web Services Region. For example, if you  are copying an encrypted cluster snapshot from the us-east-1 Amazon Web Services Region, then your  SourceDBClusterSnapshotIdentifier looks  something like the following:  arn:aws:rds:us-east-1:12345678012:sample-cluster:sample-cluster-snapshot.    TargetDBClusterSnapshotIdentifier - The  identifier for the new cluster snapshot to be created. This parameter isn't case sensitive.
        public let preSignedUrl: String?
        /// The identifier of the cluster snapshot to copy. This parameter is not case sensitive.  Constraints:   Must specify a valid system snapshot in the  available state.   If the source snapshot is in the same Amazon Web Services Region as the copy, specify a valid snapshot identifier.    If the source snapshot is in a different Amazon Web Services Region than the copy, specify a valid cluster snapshot ARN.   Example: my-cluster-snapshot1
        public let sourceDBClusterSnapshotIdentifier: String
        /// The tags to be assigned to the cluster snapshot.
        @OptionalCustomCoding<ArrayCoder<_TagsEncoding, Tag>>
        public var tags: [Tag]?
        /// The identifier of the new cluster snapshot to create from the  source cluster snapshot. This parameter is not case sensitive. Constraints:   Must contain from 1 to 63 letters, numbers, or hyphens.    The first character must be a letter.   Cannot end with a hyphen or contain two consecutive hyphens.    Example: my-cluster-snapshot2
        public let targetDBClusterSnapshotIdentifier: String

        public init(copyTags: Bool? = nil, kmsKeyId: String? = nil, preSignedUrl: String? = nil, sourceDBClusterSnapshotIdentifier: String, tags: [Tag]? = nil, targetDBClusterSnapshotIdentifier: String) {
            self.copyTags = copyTags
            self.kmsKeyId = kmsKeyId
            self.preSignedUrl = preSignedUrl
            self.sourceDBClusterSnapshotIdentifier = sourceDBClusterSnapshotIdentifier
            self.tags = tags
            self.targetDBClusterSnapshotIdentifier = targetDBClusterSnapshotIdentifier
        }

        private enum CodingKeys: String, CodingKey {
            case copyTags = "CopyTags"
            case kmsKeyId = "KmsKeyId"
            case preSignedUrl = "PreSignedUrl"
            case sourceDBClusterSnapshotIdentifier = "SourceDBClusterSnapshotIdentifier"
            case tags = "Tags"
            case targetDBClusterSnapshotIdentifier = "TargetDBClusterSnapshotIdentifier"
        }
    }

    public struct CopyDBClusterSnapshotResult: AWSDecodableShape {
        public let dbClusterSnapshot: DBClusterSnapshot?

        public init(dbClusterSnapshot: DBClusterSnapshot? = nil) {
            self.dbClusterSnapshot = dbClusterSnapshot
        }

        private enum CodingKeys: String, CodingKey {
            case dbClusterSnapshot = "DBClusterSnapshot"
        }
    }

    public struct CreateDBClusterMessage: AWSEncodableShape {
        public struct _AvailabilityZonesEncoding: ArrayCoderProperties { public static let member = "AvailabilityZone" }
        public struct _TagsEncoding: ArrayCoderProperties { public static let member = "Tag" }
        public struct _VpcSecurityGroupIdsEncoding: ArrayCoderProperties { public static let member = "VpcSecurityGroupId" }

        /// A list of Amazon EC2 Availability Zones that instances in the  cluster can be created in.
        @OptionalCustomCoding<ArrayCoder<_AvailabilityZonesEncoding, String>>
        public var availabilityZones: [String]?
        /// The number of days for which automated backups are retained. You  must specify a minimum value of 1. Default: 1 Constraints:   Must be a value from 1 to 35.
        public let backupRetentionPeriod: Int?
        /// The cluster identifier. This parameter is stored as a lowercase string. Constraints:   Must contain from 1 to 63 letters, numbers, or hyphens.    The first character must be a letter.   Cannot end with a hyphen or contain two consecutive hyphens.    Example: my-cluster
        public let dbClusterIdentifier: String
        /// The name of the cluster parameter group to associate with this  cluster.
        public let dbClusterParameterGroupName: String?
        /// A subnet group to associate with this cluster. Constraints: Must match the name of an existing  DBSubnetGroup. Must not be default. Example: mySubnetgroup
        public let dbSubnetGroupName: String?
        /// Specifies whether this cluster can be deleted. If  DeletionProtection is enabled, the cluster cannot be  deleted unless it is modified and DeletionProtection is  disabled. DeletionProtection protects clusters from  being accidentally deleted.
        public let deletionProtection: Bool?
        /// A list of log types that need to be enabled for exporting to Amazon  CloudWatch Logs. You can enable audit logs or profiler logs. For more  information, see  Auditing Amazon DocumentDB Events  and  Profiling Amazon DocumentDB Operations.
        @OptionalCustomCoding<StandardArrayCoder>
        public var enableCloudwatchLogsExports: [String]?
        /// The name of the database engine to be used for this cluster. Valid values: docdb
        public let engine: String
        /// The version number of the database engine to use. The --engine-version will default to the latest major engine version. For production workloads, we recommend explicitly declaring this parameter with the intended major engine version.
        public let engineVersion: String?
        /// The cluster identifier of the new global cluster.
        public let globalClusterIdentifier: String?
        /// The KMS key identifier for an encrypted cluster. The KMS key identifier is the Amazon Resource Name (ARN) for the KMS encryption key. If you are creating a cluster using the same Amazon Web Services account that owns the KMS encryption key that is used to encrypt the new cluster, you can use the KMS key alias instead of the ARN for the KMS encryption key. If an encryption key is not specified in KmsKeyId:    If the StorageEncrypted parameter is  true, Amazon DocumentDB uses your default encryption key.    KMS creates the default encryption key for your Amazon Web Services account. Your Amazon Web Services account has a different default encryption key for each Amazon Web Services Regions.
        public let kmsKeyId: String?
        /// The name of the master user for the cluster. Constraints:   Must be from 1 to 63 letters or numbers.   The first character must be a letter.   Cannot be a reserved word for the chosen database engine.
        public let masterUsername: String?
        /// The password for the master database user. This password can  contain any printable ASCII character except forward slash (/),  double quote ("), or the "at" symbol (@). Constraints: Must contain from 8 to 100 characters.
        public let masterUserPassword: String?
        /// The port number on which the instances in the cluster accept  connections.
        public let port: Int?
        /// The daily time range during which automated backups are created if automated backups are enabled using the BackupRetentionPeriod parameter.  The default is a 30-minute window selected at random from an 8-hour block of time for each Amazon Web Services Region.  Constraints:   Must be in the format hh24:mi-hh24:mi.   Must be in Universal Coordinated Time (UTC).   Must not conflict with the preferred maintenance window.    Must be at least 30 minutes.
        public let preferredBackupWindow: String?
        /// The weekly time range during which system maintenance can occur,  in Universal Coordinated Time (UTC). Format: ddd:hh24:mi-ddd:hh24:mi  The default is a 30-minute window selected at random from an 8-hour block of time for each Amazon Web Services Region, occurring on a random day of the week. Valid days: Mon, Tue, Wed, Thu, Fri, Sat, Sun Constraints: Minimum 30-minute window.
        public let preferredMaintenanceWindow: String?
        /// Not currently supported.
        public let preSignedUrl: String?
        /// Specifies whether the cluster is encrypted.
        public let storageEncrypted: Bool?
        /// The tags to be assigned to the cluster.
        @OptionalCustomCoding<ArrayCoder<_TagsEncoding, Tag>>
        public var tags: [Tag]?
        /// A list of EC2 VPC security groups to associate with this cluster.
        @OptionalCustomCoding<ArrayCoder<_VpcSecurityGroupIdsEncoding, String>>
        public var vpcSecurityGroupIds: [String]?

        public init(availabilityZones: [String]? = nil, backupRetentionPeriod: Int? = nil, dbClusterIdentifier: String, dbClusterParameterGroupName: String? = nil, dbSubnetGroupName: String? = nil, deletionProtection: Bool? = nil, enableCloudwatchLogsExports: [String]? = nil, engine: String, engineVersion: String? = nil, globalClusterIdentifier: String? = nil, kmsKeyId: String? = nil, masterUsername: String? = nil, masterUserPassword: String? = nil, port: Int? = nil, preferredBackupWindow: String? = nil, preferredMaintenanceWindow: String? = nil, preSignedUrl: String? = nil, storageEncrypted: Bool? = nil, tags: [Tag]? = nil, vpcSecurityGroupIds: [String]? = nil) {
            self.availabilityZones = availabilityZones
            self.backupRetentionPeriod = backupRetentionPeriod
            self.dbClusterIdentifier = dbClusterIdentifier
            self.dbClusterParameterGroupName = dbClusterParameterGroupName
            self.dbSubnetGroupName = dbSubnetGroupName
            self.deletionProtection = deletionProtection
            self.enableCloudwatchLogsExports = enableCloudwatchLogsExports
            self.engine = engine
            self.engineVersion = engineVersion
            self.globalClusterIdentifier = globalClusterIdentifier
            self.kmsKeyId = kmsKeyId
            self.masterUsername = masterUsername
            self.masterUserPassword = masterUserPassword
            self.port = port
            self.preferredBackupWindow = preferredBackupWindow
            self.preferredMaintenanceWindow = preferredMaintenanceWindow
            self.preSignedUrl = preSignedUrl
            self.storageEncrypted = storageEncrypted
            self.tags = tags
            self.vpcSecurityGroupIds = vpcSecurityGroupIds
        }

        public func validate(name: String) throws {
            try self.validate(self.globalClusterIdentifier, name: "globalClusterIdentifier", parent: name, max: 255)
            try self.validate(self.globalClusterIdentifier, name: "globalClusterIdentifier", parent: name, min: 1)
            try self.validate(self.globalClusterIdentifier, name: "globalClusterIdentifier", parent: name, pattern: "^[A-Za-z][0-9A-Za-z-:._]*$")
        }

        private enum CodingKeys: String, CodingKey {
            case availabilityZones = "AvailabilityZones"
            case backupRetentionPeriod = "BackupRetentionPeriod"
            case dbClusterIdentifier = "DBClusterIdentifier"
            case dbClusterParameterGroupName = "DBClusterParameterGroupName"
            case dbSubnetGroupName = "DBSubnetGroupName"
            case deletionProtection = "DeletionProtection"
            case enableCloudwatchLogsExports = "EnableCloudwatchLogsExports"
            case engine = "Engine"
            case engineVersion = "EngineVersion"
            case globalClusterIdentifier = "GlobalClusterIdentifier"
            case kmsKeyId = "KmsKeyId"
            case masterUsername = "MasterUsername"
            case masterUserPassword = "MasterUserPassword"
            case port = "Port"
            case preferredBackupWindow = "PreferredBackupWindow"
            case preferredMaintenanceWindow = "PreferredMaintenanceWindow"
            case preSignedUrl = "PreSignedUrl"
            case storageEncrypted = "StorageEncrypted"
            case tags = "Tags"
            case vpcSecurityGroupIds = "VpcSecurityGroupIds"
        }
    }

    public struct CreateDBClusterParameterGroupMessage: AWSEncodableShape {
        public struct _TagsEncoding: ArrayCoderProperties { public static let member = "Tag" }

        /// The name of the cluster parameter group. Constraints:   Must not match the name of an existing DBClusterParameterGroup.    This value is stored as a lowercase string.
        public let dbClusterParameterGroupName: String
        /// The cluster parameter group family name.
        public let dbParameterGroupFamily: String
        /// The description for the cluster parameter group.
        public let description: String
        /// The tags to be assigned to the cluster parameter group.
        @OptionalCustomCoding<ArrayCoder<_TagsEncoding, Tag>>
        public var tags: [Tag]?

        public init(dbClusterParameterGroupName: String, dbParameterGroupFamily: String, description: String, tags: [Tag]? = nil) {
            self.dbClusterParameterGroupName = dbClusterParameterGroupName
            self.dbParameterGroupFamily = dbParameterGroupFamily
            self.description = description
            self.tags = tags
        }

        private enum CodingKeys: String, CodingKey {
            case dbClusterParameterGroupName = "DBClusterParameterGroupName"
            case dbParameterGroupFamily = "DBParameterGroupFamily"
            case description = "Description"
            case tags = "Tags"
        }
    }

    public struct CreateDBClusterParameterGroupResult: AWSDecodableShape {
        public let dbClusterParameterGroup: DBClusterParameterGroup?

        public init(dbClusterParameterGroup: DBClusterParameterGroup? = nil) {
            self.dbClusterParameterGroup = dbClusterParameterGroup
        }

        private enum CodingKeys: String, CodingKey {
            case dbClusterParameterGroup = "DBClusterParameterGroup"
        }
    }

    public struct CreateDBClusterResult: AWSDecodableShape {
        public let dbCluster: DBCluster?

        public init(dbCluster: DBCluster? = nil) {
            self.dbCluster = dbCluster
        }

        private enum CodingKeys: String, CodingKey {
            case dbCluster = "DBCluster"
        }
    }

    public struct CreateDBClusterSnapshotMessage: AWSEncodableShape {
        public struct _TagsEncoding: ArrayCoderProperties { public static let member = "Tag" }

        /// The identifier of the cluster to create a snapshot for. This  parameter is not case sensitive. Constraints:   Must match the identifier of an existing  DBCluster.   Example: my-cluster
        public let dbClusterIdentifier: String
        /// The identifier of the cluster snapshot. This parameter is stored  as a lowercase string. Constraints:   Must contain from 1 to 63 letters, numbers, or hyphens.   The first character must be a letter.   Cannot end with a hyphen or contain two consecutive hyphens.    Example: my-cluster-snapshot1
        public let dbClusterSnapshotIdentifier: String
        /// The tags to be assigned to the cluster snapshot.
        @OptionalCustomCoding<ArrayCoder<_TagsEncoding, Tag>>
        public var tags: [Tag]?

        public init(dbClusterIdentifier: String, dbClusterSnapshotIdentifier: String, tags: [Tag]? = nil) {
            self.dbClusterIdentifier = dbClusterIdentifier
            self.dbClusterSnapshotIdentifier = dbClusterSnapshotIdentifier
            self.tags = tags
        }

        private enum CodingKeys: String, CodingKey {
            case dbClusterIdentifier = "DBClusterIdentifier"
            case dbClusterSnapshotIdentifier = "DBClusterSnapshotIdentifier"
            case tags = "Tags"
        }
    }

    public struct CreateDBClusterSnapshotResult: AWSDecodableShape {
        public let dbClusterSnapshot: DBClusterSnapshot?

        public init(dbClusterSnapshot: DBClusterSnapshot? = nil) {
            self.dbClusterSnapshot = dbClusterSnapshot
        }

        private enum CodingKeys: String, CodingKey {
            case dbClusterSnapshot = "DBClusterSnapshot"
        }
    }

    public struct CreateDBInstanceMessage: AWSEncodableShape {
        public struct _TagsEncoding: ArrayCoderProperties { public static let member = "Tag" }

        /// This parameter does not apply to Amazon DocumentDB. Amazon DocumentDB does not perform minor version upgrades regardless of the value set. Default: false
        public let autoMinorVersionUpgrade: Bool?
        /// The Amazon EC2 Availability Zone that the instance is created in.  Default: A random, system-chosen Availability Zone in the endpoint's Amazon Web Services Region. Example: us-east-1d
        public let availabilityZone: String?
        /// A value that indicates whether to copy tags from the DB instance to snapshots of the DB instance. By default, tags are not copied.
        public let copyTagsToSnapshot: Bool?
        /// The identifier of the cluster that the instance will belong to.
        public let dbClusterIdentifier: String
        /// The compute and memory capacity of the instance; for example, db.r5.large.
        public let dbInstanceClass: String
        /// The instance identifier. This parameter is stored as a lowercase string. Constraints:   Must contain from 1 to 63 letters, numbers, or hyphens.   The first character must be a letter.   Cannot end with a hyphen or contain two consecutive hyphens.   Example: mydbinstance
        public let dbInstanceIdentifier: String
        /// A value that indicates whether to enable Performance Insights for the DB Instance. For more information, see Using Amazon Performance Insights.
        public let enablePerformanceInsights: Bool?
        /// The name of the database engine to be used for this instance. Valid value: docdb
        public let engine: String
        /// The KMS key identifier for encryption of Performance Insights data. The KMS key identifier is the key ARN, key ID, alias ARN, or alias name for the KMS key. If you do not specify a value for PerformanceInsightsKMSKeyId, then Amazon DocumentDB uses your default KMS key. There is a default KMS key for your Amazon Web Services account. Your Amazon Web Services account has a different default KMS key for each Amazon Web Services region.
        public let performanceInsightsKMSKeyId: String?
        /// The time range each week during which system maintenance can occur, in Universal Coordinated Time (UTC). Format: ddd:hh24:mi-ddd:hh24:mi  The default is a 30-minute window selected at random from an 8-hour block of time for each Amazon Web Services Region, occurring on a random day of the week.  Valid days: Mon, Tue, Wed, Thu, Fri, Sat, Sun Constraints: Minimum 30-minute window.
        public let preferredMaintenanceWindow: String?
        /// A value that specifies the order in which an Amazon DocumentDB replica is promoted to the primary instance after a failure of the existing primary instance. Default: 1 Valid values: 0-15
        public let promotionTier: Int?
        /// The tags to be assigned to the instance. You can assign up to  10 tags to an instance.
        @OptionalCustomCoding<ArrayCoder<_TagsEncoding, Tag>>
        public var tags: [Tag]?

        public init(autoMinorVersionUpgrade: Bool? = nil, availabilityZone: String? = nil, copyTagsToSnapshot: Bool? = nil, dbClusterIdentifier: String, dbInstanceClass: String, dbInstanceIdentifier: String, enablePerformanceInsights: Bool? = nil, engine: String, performanceInsightsKMSKeyId: String? = nil, preferredMaintenanceWindow: String? = nil, promotionTier: Int? = nil, tags: [Tag]? = nil) {
            self.autoMinorVersionUpgrade = autoMinorVersionUpgrade
            self.availabilityZone = availabilityZone
            self.copyTagsToSnapshot = copyTagsToSnapshot
            self.dbClusterIdentifier = dbClusterIdentifier
            self.dbInstanceClass = dbInstanceClass
            self.dbInstanceIdentifier = dbInstanceIdentifier
            self.enablePerformanceInsights = enablePerformanceInsights
            self.engine = engine
            self.performanceInsightsKMSKeyId = performanceInsightsKMSKeyId
            self.preferredMaintenanceWindow = preferredMaintenanceWindow
            self.promotionTier = promotionTier
            self.tags = tags
        }

        private enum CodingKeys: String, CodingKey {
            case autoMinorVersionUpgrade = "AutoMinorVersionUpgrade"
            case availabilityZone = "AvailabilityZone"
            case copyTagsToSnapshot = "CopyTagsToSnapshot"
            case dbClusterIdentifier = "DBClusterIdentifier"
            case dbInstanceClass = "DBInstanceClass"
            case dbInstanceIdentifier = "DBInstanceIdentifier"
            case enablePerformanceInsights = "EnablePerformanceInsights"
            case engine = "Engine"
            case performanceInsightsKMSKeyId = "PerformanceInsightsKMSKeyId"
            case preferredMaintenanceWindow = "PreferredMaintenanceWindow"
            case promotionTier = "PromotionTier"
            case tags = "Tags"
        }
    }

    public struct CreateDBInstanceResult: AWSDecodableShape {
        public let dbInstance: DBInstance?

        public init(dbInstance: DBInstance? = nil) {
            self.dbInstance = dbInstance
        }

        private enum CodingKeys: String, CodingKey {
            case dbInstance = "DBInstance"
        }
    }

    public struct CreateDBSubnetGroupMessage: AWSEncodableShape {
        public struct _SubnetIdsEncoding: ArrayCoderProperties { public static let member = "SubnetIdentifier" }
        public struct _TagsEncoding: ArrayCoderProperties { public static let member = "Tag" }

        /// The description for the subnet group.
        public let dbSubnetGroupDescription: String
        /// The name for the subnet group. This value is stored as a lowercase string. Constraints: Must contain no more than 255 letters, numbers, periods, underscores, spaces, or hyphens. Must not be default. Example: mySubnetgroup
        public let dbSubnetGroupName: String
        /// The Amazon EC2 subnet IDs for the subnet group.
        @CustomCoding<ArrayCoder<_SubnetIdsEncoding, String>>
        public var subnetIds: [String]
        /// The tags to be assigned to the subnet group.
        @OptionalCustomCoding<ArrayCoder<_TagsEncoding, Tag>>
        public var tags: [Tag]?

        public init(dbSubnetGroupDescription: String, dbSubnetGroupName: String, subnetIds: [String], tags: [Tag]? = nil) {
            self.dbSubnetGroupDescription = dbSubnetGroupDescription
            self.dbSubnetGroupName = dbSubnetGroupName
            self.subnetIds = subnetIds
            self.tags = tags
        }

        private enum CodingKeys: String, CodingKey {
            case dbSubnetGroupDescription = "DBSubnetGroupDescription"
            case dbSubnetGroupName = "DBSubnetGroupName"
            case subnetIds = "SubnetIds"
            case tags = "Tags"
        }
    }

    public struct CreateDBSubnetGroupResult: AWSDecodableShape {
        public let dbSubnetGroup: DBSubnetGroup?

        public init(dbSubnetGroup: DBSubnetGroup? = nil) {
            self.dbSubnetGroup = dbSubnetGroup
        }

        private enum CodingKeys: String, CodingKey {
            case dbSubnetGroup = "DBSubnetGroup"
        }
    }

    public struct CreateEventSubscriptionMessage: AWSEncodableShape {
        public struct _EventCategoriesEncoding: ArrayCoderProperties { public static let member = "EventCategory" }
        public struct _SourceIdsEncoding: ArrayCoderProperties { public static let member = "SourceId" }
        public struct _TagsEncoding: ArrayCoderProperties { public static let member = "Tag" }

        ///  A Boolean value; set to true to activate the subscription, set to false to create the subscription but not active it.
        public let enabled: Bool?
        ///  A list of event categories for a SourceType that you want to subscribe to.
        @OptionalCustomCoding<ArrayCoder<_EventCategoriesEncoding, String>>
        public var eventCategories: [String]?
        /// The Amazon Resource Name (ARN) of the SNS topic created for event notification. Amazon SNS creates the ARN when you create a topic and subscribe to it.
        public let snsTopicArn: String
        /// The list of identifiers of the event sources for which events are returned. If not specified, then all sources are included in the response. An identifier must begin with a letter and must contain only ASCII letters, digits, and hyphens; it can't end with a hyphen or contain two consecutive hyphens. Constraints:   If SourceIds are provided, SourceType must also be provided.   If the source type is an instance, a DBInstanceIdentifier must be provided.   If the source type is a security group, a DBSecurityGroupName must be provided.   If the source type is a parameter group, a DBParameterGroupName must be provided.   If the source type is a snapshot, a DBSnapshotIdentifier must be provided.
        @OptionalCustomCoding<ArrayCoder<_SourceIdsEncoding, String>>
        public var sourceIds: [String]?
        /// The type of source that is generating the events. For example, if you want to be notified of events generated by an instance, you would set this parameter to db-instance. If this value is not specified, all events are returned. Valid values: db-instance, db-cluster, db-parameter-group, db-security-group, db-cluster-snapshot
        public let sourceType: String?
        /// The name of the subscription. Constraints: The name must be fewer than 255 characters.
        public let subscriptionName: String
        /// The tags to be assigned to the event subscription.
        @OptionalCustomCoding<ArrayCoder<_TagsEncoding, Tag>>
        public var tags: [Tag]?

        public init(enabled: Bool? = nil, eventCategories: [String]? = nil, snsTopicArn: String, sourceIds: [String]? = nil, sourceType: String? = nil, subscriptionName: String, tags: [Tag]? = nil) {
            self.enabled = enabled
            self.eventCategories = eventCategories
            self.snsTopicArn = snsTopicArn
            self.sourceIds = sourceIds
            self.sourceType = sourceType
            self.subscriptionName = subscriptionName
            self.tags = tags
        }

        private enum CodingKeys: String, CodingKey {
            case enabled = "Enabled"
            case eventCategories = "EventCategories"
            case snsTopicArn = "SnsTopicArn"
            case sourceIds = "SourceIds"
            case sourceType = "SourceType"
            case subscriptionName = "SubscriptionName"
            case tags = "Tags"
        }
    }

    public struct CreateEventSubscriptionResult: AWSDecodableShape {
        public let eventSubscription: EventSubscription?

        public init(eventSubscription: EventSubscription? = nil) {
            self.eventSubscription = eventSubscription
        }

        private enum CodingKeys: String, CodingKey {
            case eventSubscription = "EventSubscription"
        }
    }

    public struct CreateGlobalClusterMessage: AWSEncodableShape {
        /// The name for your database of up to 64 alpha-numeric characters. If you do not provide a name, Amazon DocumentDB will not create a database in the global cluster you are creating.
        public let databaseName: String?
        /// The deletion protection setting for the new global cluster. The global cluster can't be deleted when deletion protection is enabled.
        public let deletionProtection: Bool?
        /// The name of the database engine to be used for this cluster.
        public let engine: String?
        /// The engine version of the global cluster.
        public let engineVersion: String?
        /// The cluster identifier of the new global cluster.
        public let globalClusterIdentifier: String
        /// The Amazon Resource Name (ARN) to use as the primary cluster of the global cluster. This parameter is optional.
        public let sourceDBClusterIdentifier: String?
        /// The storage encryption setting for the new global cluster.
        public let storageEncrypted: Bool?

        public init(databaseName: String? = nil, deletionProtection: Bool? = nil, engine: String? = nil, engineVersion: String? = nil, globalClusterIdentifier: String, sourceDBClusterIdentifier: String? = nil, storageEncrypted: Bool? = nil) {
            self.databaseName = databaseName
            self.deletionProtection = deletionProtection
            self.engine = engine
            self.engineVersion = engineVersion
            self.globalClusterIdentifier = globalClusterIdentifier
            self.sourceDBClusterIdentifier = sourceDBClusterIdentifier
            self.storageEncrypted = storageEncrypted
        }

        public func validate(name: String) throws {
            try self.validate(self.globalClusterIdentifier, name: "globalClusterIdentifier", parent: name, max: 255)
            try self.validate(self.globalClusterIdentifier, name: "globalClusterIdentifier", parent: name, min: 1)
            try self.validate(self.globalClusterIdentifier, name: "globalClusterIdentifier", parent: name, pattern: "^[A-Za-z][0-9A-Za-z-:._]*$")
        }

        private enum CodingKeys: String, CodingKey {
            case databaseName = "DatabaseName"
            case deletionProtection = "DeletionProtection"
            case engine = "Engine"
            case engineVersion = "EngineVersion"
            case globalClusterIdentifier = "GlobalClusterIdentifier"
            case sourceDBClusterIdentifier = "SourceDBClusterIdentifier"
            case storageEncrypted = "StorageEncrypted"
        }
    }

    public struct CreateGlobalClusterResult: AWSDecodableShape {
        public let globalCluster: GlobalCluster?

        public init(globalCluster: GlobalCluster? = nil) {
            self.globalCluster = globalCluster
        }

        private enum CodingKeys: String, CodingKey {
            case globalCluster = "GlobalCluster"
        }
    }

    public struct DBCluster: AWSDecodableShape {
        public struct _AssociatedRolesEncoding: ArrayCoderProperties { public static let member = "DBClusterRole" }
        public struct _AvailabilityZonesEncoding: ArrayCoderProperties { public static let member = "AvailabilityZone" }
        public struct _DBClusterMembersEncoding: ArrayCoderProperties { public static let member = "DBClusterMember" }
        public struct _ReadReplicaIdentifiersEncoding: ArrayCoderProperties { public static let member = "ReadReplicaIdentifier" }
        public struct _VpcSecurityGroupsEncoding: ArrayCoderProperties { public static let member = "VpcSecurityGroupMembership" }

        /// Provides a list of the Identity and Access Management (IAM) roles that are associated with the cluster. (IAM) roles that are associated with a cluster grant permission for the cluster to access other Amazon Web Services services on your behalf.
        @OptionalCustomCoding<ArrayCoder<_AssociatedRolesEncoding, DBClusterRole>>
        public var associatedRoles: [DBClusterRole]?
        /// Provides the list of Amazon EC2 Availability Zones that instances in the cluster can be created in.
        @OptionalCustomCoding<ArrayCoder<_AvailabilityZonesEncoding, String>>
        public var availabilityZones: [String]?
        /// Specifies the number of days for which automatic snapshots are retained.
        public let backupRetentionPeriod: Int?
        /// Identifies the clone group to which the DB cluster is associated.
        public let cloneGroupId: String?
        /// Specifies the time when the cluster was created, in Universal Coordinated Time (UTC).
        public let clusterCreateTime: Date?
        /// The Amazon Resource Name (ARN) for the cluster.
        public let dbClusterArn: String?
        /// Contains a user-supplied cluster identifier. This identifier is the unique key that identifies a cluster.
        public let dbClusterIdentifier: String?
        /// Provides the list of instances that make up the cluster.
        @OptionalCustomCoding<ArrayCoder<_DBClusterMembersEncoding, DBClusterMember>>
        public var dbClusterMembers: [DBClusterMember]?
        /// Specifies the name of the cluster parameter group for the cluster.
        public let dbClusterParameterGroup: String?
        /// The Amazon Web Services Region-unique, immutable identifier for the cluster. This identifier is found in CloudTrail log entries whenever the KMS key for the cluster is accessed.
        public let dbClusterResourceId: String?
        /// Specifies information on the subnet group that is associated with the cluster, including the name, description, and subnets in the subnet group.
        public let dbSubnetGroup: String?
        /// Specifies whether this cluster can be deleted. If DeletionProtection is enabled, the cluster cannot be deleted unless it is modified and DeletionProtection is disabled. DeletionProtection protects clusters from being accidentally deleted.
        public let deletionProtection: Bool?
        /// The earliest time to which a database can be restored with point-in-time restore.
        public let earliestRestorableTime: Date?
        /// A list of log types that this cluster is configured to export to Amazon CloudWatch Logs.
        @OptionalCustomCoding<StandardArrayCoder>
        public var enabledCloudwatchLogsExports: [String]?
        /// Specifies the connection endpoint for the primary instance of the cluster.
        public let endpoint: String?
        /// Provides the name of the database engine to be used for this cluster.
        public let engine: String?
        /// Indicates the database engine version.
        public let engineVersion: String?
        /// Specifies the ID that Amazon Route 53 assigns when you create a hosted zone.
        public let hostedZoneId: String?
        /// If StorageEncrypted is true, the KMS key identifier for the encrypted cluster.
        public let kmsKeyId: String?
        /// Specifies the latest time to which a database can be restored with point-in-time restore.
        public let latestRestorableTime: Date?
        /// Contains the master user name for the cluster.
        public let masterUsername: String?
        /// Specifies whether the cluster has instances in multiple Availability Zones.
        public let multiAZ: Bool?
        /// Specifies the progress of the operation as a percentage.
        public let percentProgress: String?
        /// Specifies the port that the database engine is listening on.
        public let port: Int?
        /// Specifies the daily time range during which automated backups are created if automated backups are enabled, as determined by the BackupRetentionPeriod.
        public let preferredBackupWindow: String?
        /// Specifies the weekly time range during which system maintenance can occur, in Universal Coordinated Time (UTC).
        public let preferredMaintenanceWindow: String?
        /// The reader endpoint for the cluster. The reader endpoint for a cluster load balances connections across the Amazon DocumentDB replicas that are available in a cluster. As clients request new connections to the reader endpoint, Amazon DocumentDB distributes the connection requests among the Amazon DocumentDB replicas in the cluster. This functionality can help balance your read workload across multiple Amazon DocumentDB replicas in your cluster.  If a failover occurs, and the Amazon DocumentDB replica that you are connected to is promoted to be the primary instance, your connection is dropped. To continue sending your read workload to other Amazon DocumentDB replicas in the cluster, you can then reconnect to the reader endpoint.
        public let readerEndpoint: String?
        /// Contains one or more identifiers of the secondary clusters that are associated with this cluster.
        @OptionalCustomCoding<ArrayCoder<_ReadReplicaIdentifiersEncoding, String>>
        public var readReplicaIdentifiers: [String]?
        /// Contains the identifier of the source cluster if this cluster is a secondary cluster.
        public let replicationSourceIdentifier: String?
        /// Specifies the current state of this cluster.
        public let status: String?
        /// Specifies whether the cluster is encrypted.
        public let storageEncrypted: Bool?
        /// Provides a list of virtual private cloud (VPC) security groups that the cluster belongs to.
        @OptionalCustomCoding<ArrayCoder<_VpcSecurityGroupsEncoding, VpcSecurityGroupMembership>>
        public var vpcSecurityGroups: [VpcSecurityGroupMembership]?

        public init(associatedRoles: [DBClusterRole]? = nil, availabilityZones: [String]? = nil, backupRetentionPeriod: Int? = nil, cloneGroupId: String? = nil, clusterCreateTime: Date? = nil, dbClusterArn: String? = nil, dbClusterIdentifier: String? = nil, dbClusterMembers: [DBClusterMember]? = nil, dbClusterParameterGroup: String? = nil, dbClusterResourceId: String? = nil, dbSubnetGroup: String? = nil, deletionProtection: Bool? = nil, earliestRestorableTime: Date? = nil, enabledCloudwatchLogsExports: [String]? = nil, endpoint: String? = nil, engine: String? = nil, engineVersion: String? = nil, hostedZoneId: String? = nil, kmsKeyId: String? = nil, latestRestorableTime: Date? = nil, masterUsername: String? = nil, multiAZ: Bool? = nil, percentProgress: String? = nil, port: Int? = nil, preferredBackupWindow: String? = nil, preferredMaintenanceWindow: String? = nil, readerEndpoint: String? = nil, readReplicaIdentifiers: [String]? = nil, replicationSourceIdentifier: String? = nil, status: String? = nil, storageEncrypted: Bool? = nil, vpcSecurityGroups: [VpcSecurityGroupMembership]? = nil) {
            self.associatedRoles = associatedRoles
            self.availabilityZones = availabilityZones
            self.backupRetentionPeriod = backupRetentionPeriod
            self.cloneGroupId = cloneGroupId
            self.clusterCreateTime = clusterCreateTime
            self.dbClusterArn = dbClusterArn
            self.dbClusterIdentifier = dbClusterIdentifier
            self.dbClusterMembers = dbClusterMembers
            self.dbClusterParameterGroup = dbClusterParameterGroup
            self.dbClusterResourceId = dbClusterResourceId
            self.dbSubnetGroup = dbSubnetGroup
            self.deletionProtection = deletionProtection
            self.earliestRestorableTime = earliestRestorableTime
            self.enabledCloudwatchLogsExports = enabledCloudwatchLogsExports
            self.endpoint = endpoint
            self.engine = engine
            self.engineVersion = engineVersion
            self.hostedZoneId = hostedZoneId
            self.kmsKeyId = kmsKeyId
            self.latestRestorableTime = latestRestorableTime
            self.masterUsername = masterUsername
            self.multiAZ = multiAZ
            self.percentProgress = percentProgress
            self.port = port
            self.preferredBackupWindow = preferredBackupWindow
            self.preferredMaintenanceWindow = preferredMaintenanceWindow
            self.readerEndpoint = readerEndpoint
            self.readReplicaIdentifiers = readReplicaIdentifiers
            self.replicationSourceIdentifier = replicationSourceIdentifier
            self.status = status
            self.storageEncrypted = storageEncrypted
            self.vpcSecurityGroups = vpcSecurityGroups
        }

        private enum CodingKeys: String, CodingKey {
            case associatedRoles = "AssociatedRoles"
            case availabilityZones = "AvailabilityZones"
            case backupRetentionPeriod = "BackupRetentionPeriod"
            case cloneGroupId = "CloneGroupId"
            case clusterCreateTime = "ClusterCreateTime"
            case dbClusterArn = "DBClusterArn"
            case dbClusterIdentifier = "DBClusterIdentifier"
            case dbClusterMembers = "DBClusterMembers"
            case dbClusterParameterGroup = "DBClusterParameterGroup"
            case dbClusterResourceId = "DbClusterResourceId"
            case dbSubnetGroup = "DBSubnetGroup"
            case deletionProtection = "DeletionProtection"
            case earliestRestorableTime = "EarliestRestorableTime"
            case enabledCloudwatchLogsExports = "EnabledCloudwatchLogsExports"
            case endpoint = "Endpoint"
            case engine = "Engine"
            case engineVersion = "EngineVersion"
            case hostedZoneId = "HostedZoneId"
            case kmsKeyId = "KmsKeyId"
            case latestRestorableTime = "LatestRestorableTime"
            case masterUsername = "MasterUsername"
            case multiAZ = "MultiAZ"
            case percentProgress = "PercentProgress"
            case port = "Port"
            case preferredBackupWindow = "PreferredBackupWindow"
            case preferredMaintenanceWindow = "PreferredMaintenanceWindow"
            case readerEndpoint = "ReaderEndpoint"
            case readReplicaIdentifiers = "ReadReplicaIdentifiers"
            case replicationSourceIdentifier = "ReplicationSourceIdentifier"
            case status = "Status"
            case storageEncrypted = "StorageEncrypted"
            case vpcSecurityGroups = "VpcSecurityGroups"
        }
    }

    public struct DBClusterMember: AWSDecodableShape {
        /// Specifies the status of the cluster parameter group for this member of the DB cluster.
        public let dbClusterParameterGroupStatus: String?
        /// Specifies the instance identifier for this member of the cluster.
        public let dbInstanceIdentifier: String?
        /// A value that is true if the cluster member is the primary instance for the cluster and false otherwise.
        public let isClusterWriter: Bool?
        /// A value that specifies the order in which an Amazon DocumentDB replica is promoted to the primary instance after a failure of the existing primary instance.
        public let promotionTier: Int?

        public init(dbClusterParameterGroupStatus: String? = nil, dbInstanceIdentifier: String? = nil, isClusterWriter: Bool? = nil, promotionTier: Int? = nil) {
            self.dbClusterParameterGroupStatus = dbClusterParameterGroupStatus
            self.dbInstanceIdentifier = dbInstanceIdentifier
            self.isClusterWriter = isClusterWriter
            self.promotionTier = promotionTier
        }

        private enum CodingKeys: String, CodingKey {
            case dbClusterParameterGroupStatus = "DBClusterParameterGroupStatus"
            case dbInstanceIdentifier = "DBInstanceIdentifier"
            case isClusterWriter = "IsClusterWriter"
            case promotionTier = "PromotionTier"
        }
    }

    public struct DBClusterMessage: AWSDecodableShape {
        public struct _DBClustersEncoding: ArrayCoderProperties { public static let member = "DBCluster" }

        /// A list of clusters.
        @OptionalCustomCoding<ArrayCoder<_DBClustersEncoding, DBCluster>>
        public var dbClusters: [DBCluster]?
        /// An optional pagination token provided by a previous request. If this parameter is specified, the response includes only records beyond the marker, up to the value specified by MaxRecords.
        public let marker: String?

        public init(dbClusters: [DBCluster]? = nil, marker: String? = nil) {
            self.dbClusters = dbClusters
            self.marker = marker
        }

        private enum CodingKeys: String, CodingKey {
            case dbClusters = "DBClusters"
            case marker = "Marker"
        }
    }

    public struct DBClusterParameterGroup: AWSDecodableShape {
        /// The Amazon Resource Name (ARN) for the cluster parameter group.
        public let dbClusterParameterGroupArn: String?
        /// Provides the name of the cluster parameter group.
        public let dbClusterParameterGroupName: String?
        /// Provides the name of the parameter group family that this cluster parameter group is compatible with.
        public let dbParameterGroupFamily: String?
        /// Provides the customer-specified description for this cluster parameter group.
        public let description: String?

        public init(dbClusterParameterGroupArn: String? = nil, dbClusterParameterGroupName: String? = nil, dbParameterGroupFamily: String? = nil, description: String? = nil) {
            self.dbClusterParameterGroupArn = dbClusterParameterGroupArn
            self.dbClusterParameterGroupName = dbClusterParameterGroupName
            self.dbParameterGroupFamily = dbParameterGroupFamily
            self.description = description
        }

        private enum CodingKeys: String, CodingKey {
            case dbClusterParameterGroupArn = "DBClusterParameterGroupArn"
            case dbClusterParameterGroupName = "DBClusterParameterGroupName"
            case dbParameterGroupFamily = "DBParameterGroupFamily"
            case description = "Description"
        }
    }

    public struct DBClusterParameterGroupDetails: AWSDecodableShape {
        public struct _ParametersEncoding: ArrayCoderProperties { public static let member = "Parameter" }

        /// An optional pagination token provided by a previous request. If this parameter is specified, the response includes only records beyond the marker, up to the value specified by MaxRecords.
        public let marker: String?
        /// Provides a list of parameters for the cluster parameter group.
        @OptionalCustomCoding<ArrayCoder<_ParametersEncoding, Parameter>>
        public var parameters: [Parameter]?

        public init(marker: String? = nil, parameters: [Parameter]? = nil) {
            self.marker = marker
            self.parameters = parameters
        }

        private enum CodingKeys: String, CodingKey {
            case marker = "Marker"
            case parameters = "Parameters"
        }
    }

    public struct DBClusterParameterGroupNameMessage: AWSDecodableShape {
        /// The name of a cluster parameter group. Constraints:   Must be from 1 to 255 letters or numbers.   The first character must be a letter.   Cannot end with a hyphen or contain two consecutive hyphens.    This value is stored as a lowercase string.
        public let dbClusterParameterGroupName: String?

        public init(dbClusterParameterGroupName: String? = nil) {
            self.dbClusterParameterGroupName = dbClusterParameterGroupName
        }

        private enum CodingKeys: String, CodingKey {
            case dbClusterParameterGroupName = "DBClusterParameterGroupName"
        }
    }

    public struct DBClusterParameterGroupsMessage: AWSDecodableShape {
        public struct _DBClusterParameterGroupsEncoding: ArrayCoderProperties { public static let member = "DBClusterParameterGroup" }

        /// A list of cluster parameter groups.
        @OptionalCustomCoding<ArrayCoder<_DBClusterParameterGroupsEncoding, DBClusterParameterGroup>>
        public var dbClusterParameterGroups: [DBClusterParameterGroup]?
        /// An optional pagination token provided by a previous request. If this parameter is specified, the response includes only records beyond the marker, up to the value specified by MaxRecords.
        public let marker: String?

        public init(dbClusterParameterGroups: [DBClusterParameterGroup]? = nil, marker: String? = nil) {
            self.dbClusterParameterGroups = dbClusterParameterGroups
            self.marker = marker
        }

        private enum CodingKeys: String, CodingKey {
            case dbClusterParameterGroups = "DBClusterParameterGroups"
            case marker = "Marker"
        }
    }

    public struct DBClusterRole: AWSDecodableShape {
        /// The Amazon Resource Name (ARN) of the IAMrole that is associated with the DB cluster.
        public let roleArn: String?
        /// Describes the state of association between the IAMrole and the cluster. The Status property returns one of the following values:    ACTIVE - The IAMrole ARN is associated with the cluster and can be used to access other Amazon Web Services services on your behalf.    PENDING - The IAMrole ARN is being associated with the cluster.    INVALID - The IAMrole ARN is associated with the cluster, but the cluster cannot assume the IAMrole to access other Amazon Web Services services on your behalf.
        public let status: String?

        public init(roleArn: String? = nil, status: String? = nil) {
            self.roleArn = roleArn
            self.status = status
        }

        private enum CodingKeys: String, CodingKey {
            case roleArn = "RoleArn"
            case status = "Status"
        }
    }

    public struct DBClusterSnapshot: AWSDecodableShape {
        public struct _AvailabilityZonesEncoding: ArrayCoderProperties { public static let member = "AvailabilityZone" }

        /// Provides the list of Amazon EC2 Availability Zones that instances in the cluster snapshot can be restored in.
        @OptionalCustomCoding<ArrayCoder<_AvailabilityZonesEncoding, String>>
        public var availabilityZones: [String]?
        /// Specifies the time when the cluster was created, in Universal Coordinated Time (UTC).
        public let clusterCreateTime: Date?
        /// Specifies the cluster identifier of the cluster that this cluster snapshot was created from.
        public let dbClusterIdentifier: String?
        /// The Amazon Resource Name (ARN) for the cluster snapshot.
        public let dbClusterSnapshotArn: String?
        /// Specifies the identifier for the cluster snapshot.
        public let dbClusterSnapshotIdentifier: String?
        /// Specifies the name of the database engine.
        public let engine: String?
        /// Provides the version of the database engine for this cluster snapshot.
        public let engineVersion: String?
        /// If StorageEncrypted is true, the KMS key identifier for the encrypted cluster snapshot.
        public let kmsKeyId: String?
        /// Provides the master user name for the cluster snapshot.
        public let masterUsername: String?
        /// Specifies the percentage of the estimated data that has been transferred.
        public let percentProgress: Int?
        /// Specifies the port that the cluster was listening on at the time of the snapshot.
        public let port: Int?
        /// Provides the time when the snapshot was taken, in UTC.
        public let snapshotCreateTime: Date?
        /// Provides the type of the cluster snapshot.
        public let snapshotType: String?
        /// If the cluster snapshot was copied from a source cluster snapshot, the ARN for the source cluster snapshot; otherwise, a null value.
        public let sourceDBClusterSnapshotArn: String?
        /// Specifies the status of this cluster snapshot.
        public let status: String?
        /// Specifies whether the cluster snapshot is encrypted.
        public let storageEncrypted: Bool?
        /// Provides the virtual private cloud (VPC) ID that is associated with the cluster snapshot.
        public let vpcId: String?

        public init(availabilityZones: [String]? = nil, clusterCreateTime: Date? = nil, dbClusterIdentifier: String? = nil, dbClusterSnapshotArn: String? = nil, dbClusterSnapshotIdentifier: String? = nil, engine: String? = nil, engineVersion: String? = nil, kmsKeyId: String? = nil, masterUsername: String? = nil, percentProgress: Int? = nil, port: Int? = nil, snapshotCreateTime: Date? = nil, snapshotType: String? = nil, sourceDBClusterSnapshotArn: String? = nil, status: String? = nil, storageEncrypted: Bool? = nil, vpcId: String? = nil) {
            self.availabilityZones = availabilityZones
            self.clusterCreateTime = clusterCreateTime
            self.dbClusterIdentifier = dbClusterIdentifier
            self.dbClusterSnapshotArn = dbClusterSnapshotArn
            self.dbClusterSnapshotIdentifier = dbClusterSnapshotIdentifier
            self.engine = engine
            self.engineVersion = engineVersion
            self.kmsKeyId = kmsKeyId
            self.masterUsername = masterUsername
            self.percentProgress = percentProgress
            self.port = port
            self.snapshotCreateTime = snapshotCreateTime
            self.snapshotType = snapshotType
            self.sourceDBClusterSnapshotArn = sourceDBClusterSnapshotArn
            self.status = status
            self.storageEncrypted = storageEncrypted
            self.vpcId = vpcId
        }

        private enum CodingKeys: String, CodingKey {
            case availabilityZones = "AvailabilityZones"
            case clusterCreateTime = "ClusterCreateTime"
            case dbClusterIdentifier = "DBClusterIdentifier"
            case dbClusterSnapshotArn = "DBClusterSnapshotArn"
            case dbClusterSnapshotIdentifier = "DBClusterSnapshotIdentifier"
            case engine = "Engine"
            case engineVersion = "EngineVersion"
            case kmsKeyId = "KmsKeyId"
            case masterUsername = "MasterUsername"
            case percentProgress = "PercentProgress"
            case port = "Port"
            case snapshotCreateTime = "SnapshotCreateTime"
            case snapshotType = "SnapshotType"
            case sourceDBClusterSnapshotArn = "SourceDBClusterSnapshotArn"
            case status = "Status"
            case storageEncrypted = "StorageEncrypted"
            case vpcId = "VpcId"
        }
    }

    public struct DBClusterSnapshotAttribute: AWSDecodableShape {
        public struct _AttributeValuesEncoding: ArrayCoderProperties { public static let member = "AttributeValue" }

        /// The name of the manual cluster snapshot attribute. The attribute named restore refers to the list of Amazon Web Services accounts that have permission to copy or restore the manual cluster snapshot.
        public let attributeName: String?
        /// The values for the manual cluster snapshot attribute. If the AttributeName field is set to restore, then this element returns a list of IDs of the Amazon Web Services accounts that are authorized to copy or restore the manual cluster snapshot. If a value of all is in the list, then the manual cluster snapshot is public and available for any Amazon Web Services account to copy or restore.
        @OptionalCustomCoding<ArrayCoder<_AttributeValuesEncoding, String>>
        public var attributeValues: [String]?

        public init(attributeName: String? = nil, attributeValues: [String]? = nil) {
            self.attributeName = attributeName
            self.attributeValues = attributeValues
        }

        private enum CodingKeys: String, CodingKey {
            case attributeName = "AttributeName"
            case attributeValues = "AttributeValues"
        }
    }

    public struct DBClusterSnapshotAttributesResult: AWSDecodableShape {
        public struct _DBClusterSnapshotAttributesEncoding: ArrayCoderProperties { public static let member = "DBClusterSnapshotAttribute" }

        /// The list of attributes and values for the cluster snapshot.
        @OptionalCustomCoding<ArrayCoder<_DBClusterSnapshotAttributesEncoding, DBClusterSnapshotAttribute>>
        public var dbClusterSnapshotAttributes: [DBClusterSnapshotAttribute]?
        /// The identifier of the cluster snapshot that the attributes apply to.
        public let dbClusterSnapshotIdentifier: String?

        public init(dbClusterSnapshotAttributes: [DBClusterSnapshotAttribute]? = nil, dbClusterSnapshotIdentifier: String? = nil) {
            self.dbClusterSnapshotAttributes = dbClusterSnapshotAttributes
            self.dbClusterSnapshotIdentifier = dbClusterSnapshotIdentifier
        }

        private enum CodingKeys: String, CodingKey {
            case dbClusterSnapshotAttributes = "DBClusterSnapshotAttributes"
            case dbClusterSnapshotIdentifier = "DBClusterSnapshotIdentifier"
        }
    }

    public struct DBClusterSnapshotMessage: AWSDecodableShape {
        public struct _DBClusterSnapshotsEncoding: ArrayCoderProperties { public static let member = "DBClusterSnapshot" }

        /// Provides a list of cluster snapshots.
        @OptionalCustomCoding<ArrayCoder<_DBClusterSnapshotsEncoding, DBClusterSnapshot>>
        public var dbClusterSnapshots: [DBClusterSnapshot]?
        /// An optional pagination token provided by a previous request. If this parameter is specified, the response includes only records beyond the marker, up to the value specified by MaxRecords.
        public let marker: String?

        public init(dbClusterSnapshots: [DBClusterSnapshot]? = nil, marker: String? = nil) {
            self.dbClusterSnapshots = dbClusterSnapshots
            self.marker = marker
        }

        private enum CodingKeys: String, CodingKey {
            case dbClusterSnapshots = "DBClusterSnapshots"
            case marker = "Marker"
        }
    }

    public struct DBEngineVersion: AWSDecodableShape {
        public struct _ValidUpgradeTargetEncoding: ArrayCoderProperties { public static let member = "UpgradeTarget" }

        /// The description of the database engine.
        public let dbEngineDescription: String?
        /// The description of the database engine version.
        public let dbEngineVersionDescription: String?
        /// The name of the parameter group family for the database engine.
        public let dbParameterGroupFamily: String?
        /// The name of the database engine.
        public let engine: String?
        /// The version number of the database engine.
        public let engineVersion: String?
        /// The types of logs that the database engine has available for export to Amazon CloudWatch Logs.
        @OptionalCustomCoding<StandardArrayCoder>
        public var exportableLogTypes: [String]?
        /// A value that indicates whether the engine version supports exporting the log types specified by ExportableLogTypes to CloudWatch Logs.
        public let supportsLogExportsToCloudwatchLogs: Bool?
        /// A list of engine versions that this database engine version can be upgraded to.
        @OptionalCustomCoding<ArrayCoder<_ValidUpgradeTargetEncoding, UpgradeTarget>>
        public var validUpgradeTarget: [UpgradeTarget]?

        public init(dbEngineDescription: String? = nil, dbEngineVersionDescription: String? = nil, dbParameterGroupFamily: String? = nil, engine: String? = nil, engineVersion: String? = nil, exportableLogTypes: [String]? = nil, supportsLogExportsToCloudwatchLogs: Bool? = nil, validUpgradeTarget: [UpgradeTarget]? = nil) {
            self.dbEngineDescription = dbEngineDescription
            self.dbEngineVersionDescription = dbEngineVersionDescription
            self.dbParameterGroupFamily = dbParameterGroupFamily
            self.engine = engine
            self.engineVersion = engineVersion
            self.exportableLogTypes = exportableLogTypes
            self.supportsLogExportsToCloudwatchLogs = supportsLogExportsToCloudwatchLogs
            self.validUpgradeTarget = validUpgradeTarget
        }

        private enum CodingKeys: String, CodingKey {
            case dbEngineDescription = "DBEngineDescription"
            case dbEngineVersionDescription = "DBEngineVersionDescription"
            case dbParameterGroupFamily = "DBParameterGroupFamily"
            case engine = "Engine"
            case engineVersion = "EngineVersion"
            case exportableLogTypes = "ExportableLogTypes"
            case supportsLogExportsToCloudwatchLogs = "SupportsLogExportsToCloudwatchLogs"
            case validUpgradeTarget = "ValidUpgradeTarget"
        }
    }

    public struct DBEngineVersionMessage: AWSDecodableShape {
        public struct _DBEngineVersionsEncoding: ArrayCoderProperties { public static let member = "DBEngineVersion" }

        /// Detailed information about one or more engine versions.
        @OptionalCustomCoding<ArrayCoder<_DBEngineVersionsEncoding, DBEngineVersion>>
        public var dbEngineVersions: [DBEngineVersion]?
        /// An optional pagination token provided by a previous request. If this parameter is specified, the response includes only records beyond the marker, up to the value specified by MaxRecords.
        public let marker: String?

        public init(dbEngineVersions: [DBEngineVersion]? = nil, marker: String? = nil) {
            self.dbEngineVersions = dbEngineVersions
            self.marker = marker
        }

        private enum CodingKeys: String, CodingKey {
            case dbEngineVersions = "DBEngineVersions"
            case marker = "Marker"
        }
    }

    public struct DBInstance: AWSDecodableShape {
        public struct _StatusInfosEncoding: ArrayCoderProperties { public static let member = "DBInstanceStatusInfo" }
        public struct _VpcSecurityGroupsEncoding: ArrayCoderProperties { public static let member = "VpcSecurityGroupMembership" }

        /// Does not apply. This parameter does not apply to Amazon DocumentDB. Amazon DocumentDB does not perform minor version upgrades regardless of the value set.
        public let autoMinorVersionUpgrade: Bool?
        /// Specifies the name of the Availability Zone that the instance is located in.
        public let availabilityZone: String?
        /// Specifies the number of days for which automatic snapshots are retained.
        public let backupRetentionPeriod: Int?
        /// The identifier of the CA certificate for this DB instance.
        public let caCertificateIdentifier: String?
        /// A value that indicates whether to copy tags from the DB instance to snapshots of the DB instance. By default, tags are not copied.
        public let copyTagsToSnapshot: Bool?
        /// Contains the name of the cluster that the instance is a member of if the  instance is a member of a cluster.
        public let dbClusterIdentifier: String?
        /// The Amazon Resource Name (ARN) for the instance.
        public let dbInstanceArn: String?
        /// Contains the name of the compute and memory capacity class of the instance.
        public let dbInstanceClass: String?
        /// Contains a user-provided database identifier. This identifier is the unique key that identifies an instance.
        public let dbInstanceIdentifier: String?
        /// Specifies the current state of this database.
        public let dbInstanceStatus: String?
        /// The Amazon Web Services Region-unique, immutable identifier for the instance. This identifier is found in CloudTrail log entries whenever the KMS key for the instance is accessed.
        public let dbiResourceId: String?
        /// Specifies information on the subnet group that is associated with the instance, including the name, description, and subnets in the subnet group.
        public let dbSubnetGroup: DBSubnetGroup?
        /// A list of log types that this instance is configured to export to CloudWatch Logs.
        @OptionalCustomCoding<StandardArrayCoder>
        public var enabledCloudwatchLogsExports: [String]?
        /// Specifies the connection endpoint.
        public let endpoint: Endpoint?
        /// Provides the name of the database engine to be used for this instance.
        public let engine: String?
        /// Indicates the database engine version.
        public let engineVersion: String?
        /// Provides the date and time that the instance was created.
        public let instanceCreateTime: Date?
        ///  If StorageEncrypted is true, the KMS key identifier for the encrypted instance.
        public let kmsKeyId: String?
        /// Specifies the latest time to which a database can be restored with point-in-time restore.
        public let latestRestorableTime: Date?
        /// Specifies that changes to the instance are pending. This element is included only when changes are pending. Specific changes are identified by subelements.
        public let pendingModifiedValues: PendingModifiedValues?
        ///  Specifies the daily time range during which automated backups are created if automated backups are enabled, as determined by the BackupRetentionPeriod.
        public let preferredBackupWindow: String?
        /// Specifies the weekly time range during which system maintenance can occur, in Universal Coordinated Time (UTC).
        public let preferredMaintenanceWindow: String?
        /// A value that specifies the order in which an Amazon DocumentDB replica is promoted to the primary instance after a failure of the existing primary instance.
        public let promotionTier: Int?
        /// Not supported. Amazon DocumentDB does not currently support public endpoints. The value  of PubliclyAccessible is always false.
        public let publiclyAccessible: Bool?
        /// The status of a read replica. If the instance is not a read replica, this is blank.
        @OptionalCustomCoding<ArrayCoder<_StatusInfosEncoding, DBInstanceStatusInfo>>
        public var statusInfos: [DBInstanceStatusInfo]?
        /// Specifies whether or not the instance is encrypted.
        public let storageEncrypted: Bool?
        /// Provides a list of VPC security group elements that the instance belongs to.
        @OptionalCustomCoding<ArrayCoder<_VpcSecurityGroupsEncoding, VpcSecurityGroupMembership>>
        public var vpcSecurityGroups: [VpcSecurityGroupMembership]?

        public init(autoMinorVersionUpgrade: Bool? = nil, availabilityZone: String? = nil, backupRetentionPeriod: Int? = nil, caCertificateIdentifier: String? = nil, copyTagsToSnapshot: Bool? = nil, dbClusterIdentifier: String? = nil, dbInstanceArn: String? = nil, dbInstanceClass: String? = nil, dbInstanceIdentifier: String? = nil, dbInstanceStatus: String? = nil, dbiResourceId: String? = nil, dbSubnetGroup: DBSubnetGroup? = nil, enabledCloudwatchLogsExports: [String]? = nil, endpoint: Endpoint? = nil, engine: String? = nil, engineVersion: String? = nil, instanceCreateTime: Date? = nil, kmsKeyId: String? = nil, latestRestorableTime: Date? = nil, pendingModifiedValues: PendingModifiedValues? = nil, preferredBackupWindow: String? = nil, preferredMaintenanceWindow: String? = nil, promotionTier: Int? = nil, publiclyAccessible: Bool? = nil, statusInfos: [DBInstanceStatusInfo]? = nil, storageEncrypted: Bool? = nil, vpcSecurityGroups: [VpcSecurityGroupMembership]? = nil) {
            self.autoMinorVersionUpgrade = autoMinorVersionUpgrade
            self.availabilityZone = availabilityZone
            self.backupRetentionPeriod = backupRetentionPeriod
            self.caCertificateIdentifier = caCertificateIdentifier
            self.copyTagsToSnapshot = copyTagsToSnapshot
            self.dbClusterIdentifier = dbClusterIdentifier
            self.dbInstanceArn = dbInstanceArn
            self.dbInstanceClass = dbInstanceClass
            self.dbInstanceIdentifier = dbInstanceIdentifier
            self.dbInstanceStatus = dbInstanceStatus
            self.dbiResourceId = dbiResourceId
            self.dbSubnetGroup = dbSubnetGroup
            self.enabledCloudwatchLogsExports = enabledCloudwatchLogsExports
            self.endpoint = endpoint
            self.engine = engine
            self.engineVersion = engineVersion
            self.instanceCreateTime = instanceCreateTime
            self.kmsKeyId = kmsKeyId
            self.latestRestorableTime = latestRestorableTime
            self.pendingModifiedValues = pendingModifiedValues
            self.preferredBackupWindow = preferredBackupWindow
            self.preferredMaintenanceWindow = preferredMaintenanceWindow
            self.promotionTier = promotionTier
            self.publiclyAccessible = publiclyAccessible
            self.statusInfos = statusInfos
            self.storageEncrypted = storageEncrypted
            self.vpcSecurityGroups = vpcSecurityGroups
        }

        private enum CodingKeys: String, CodingKey {
            case autoMinorVersionUpgrade = "AutoMinorVersionUpgrade"
            case availabilityZone = "AvailabilityZone"
            case backupRetentionPeriod = "BackupRetentionPeriod"
            case caCertificateIdentifier = "CACertificateIdentifier"
            case copyTagsToSnapshot = "CopyTagsToSnapshot"
            case dbClusterIdentifier = "DBClusterIdentifier"
            case dbInstanceArn = "DBInstanceArn"
            case dbInstanceClass = "DBInstanceClass"
            case dbInstanceIdentifier = "DBInstanceIdentifier"
            case dbInstanceStatus = "DBInstanceStatus"
            case dbiResourceId = "DbiResourceId"
            case dbSubnetGroup = "DBSubnetGroup"
            case enabledCloudwatchLogsExports = "EnabledCloudwatchLogsExports"
            case endpoint = "Endpoint"
            case engine = "Engine"
            case engineVersion = "EngineVersion"
            case instanceCreateTime = "InstanceCreateTime"
            case kmsKeyId = "KmsKeyId"
            case latestRestorableTime = "LatestRestorableTime"
            case pendingModifiedValues = "PendingModifiedValues"
            case preferredBackupWindow = "PreferredBackupWindow"
            case preferredMaintenanceWindow = "PreferredMaintenanceWindow"
            case promotionTier = "PromotionTier"
            case publiclyAccessible = "PubliclyAccessible"
            case statusInfos = "StatusInfos"
            case storageEncrypted = "StorageEncrypted"
            case vpcSecurityGroups = "VpcSecurityGroups"
        }
    }

    public struct DBInstanceMessage: AWSDecodableShape {
        public struct _DBInstancesEncoding: ArrayCoderProperties { public static let member = "DBInstance" }

        /// Detailed information about one or more instances.
        @OptionalCustomCoding<ArrayCoder<_DBInstancesEncoding, DBInstance>>
        public var dbInstances: [DBInstance]?
        /// An optional pagination token provided by a previous request. If this parameter is specified, the response includes only records beyond the marker, up to the value specified by MaxRecords.
        public let marker: String?

        public init(dbInstances: [DBInstance]? = nil, marker: String? = nil) {
            self.dbInstances = dbInstances
            self.marker = marker
        }

        private enum CodingKeys: String, CodingKey {
            case dbInstances = "DBInstances"
            case marker = "Marker"
        }
    }

    public struct DBInstanceStatusInfo: AWSDecodableShape {
        /// Details of the error if there is an error for the instance. If the instance is not in an error state, this value is blank.
        public let message: String?
        /// A Boolean value that is true if the instance is operating normally, or false if the instance is in an error state.
        public let normal: Bool?
        /// Status of the instance. For a StatusType of read replica, the values can be replicating, error, stopped, or terminated.
        public let status: String?
        /// This value is currently "read replication."
        public let statusType: String?

        public init(message: String? = nil, normal: Bool? = nil, status: String? = nil, statusType: String? = nil) {
            self.message = message
            self.normal = normal
            self.status = status
            self.statusType = statusType
        }

        private enum CodingKeys: String, CodingKey {
            case message = "Message"
            case normal = "Normal"
            case status = "Status"
            case statusType = "StatusType"
        }
    }

    public struct DBSubnetGroup: AWSDecodableShape {
        public struct _SubnetsEncoding: ArrayCoderProperties { public static let member = "Subnet" }

        /// The Amazon Resource Name (ARN) for the DB subnet group.
        public let dbSubnetGroupArn: String?
        /// Provides the description of the subnet group.
        public let dbSubnetGroupDescription: String?
        /// The name of the subnet group.
        public let dbSubnetGroupName: String?
        /// Provides the status of the subnet group.
        public let subnetGroupStatus: String?
        /// Detailed information about one or more subnets within a subnet group.
        @OptionalCustomCoding<ArrayCoder<_SubnetsEncoding, Subnet>>
        public var subnets: [Subnet]?
        /// Provides the virtual private cloud (VPC) ID of the subnet group.
        public let vpcId: String?

        public init(dbSubnetGroupArn: String? = nil, dbSubnetGroupDescription: String? = nil, dbSubnetGroupName: String? = nil, subnetGroupStatus: String? = nil, subnets: [Subnet]? = nil, vpcId: String? = nil) {
            self.dbSubnetGroupArn = dbSubnetGroupArn
            self.dbSubnetGroupDescription = dbSubnetGroupDescription
            self.dbSubnetGroupName = dbSubnetGroupName
            self.subnetGroupStatus = subnetGroupStatus
            self.subnets = subnets
            self.vpcId = vpcId
        }

        private enum CodingKeys: String, CodingKey {
            case dbSubnetGroupArn = "DBSubnetGroupArn"
            case dbSubnetGroupDescription = "DBSubnetGroupDescription"
            case dbSubnetGroupName = "DBSubnetGroupName"
            case subnetGroupStatus = "SubnetGroupStatus"
            case subnets = "Subnets"
            case vpcId = "VpcId"
        }
    }

    public struct DBSubnetGroupMessage: AWSDecodableShape {
        public struct _DBSubnetGroupsEncoding: ArrayCoderProperties { public static let member = "DBSubnetGroup" }

        /// Detailed information about one or more subnet groups.
        @OptionalCustomCoding<ArrayCoder<_DBSubnetGroupsEncoding, DBSubnetGroup>>
        public var dbSubnetGroups: [DBSubnetGroup]?
        /// An optional pagination token provided by a previous request. If this parameter is specified, the response includes only records beyond the marker, up to the value specified by MaxRecords.
        public let marker: String?

        public init(dbSubnetGroups: [DBSubnetGroup]? = nil, marker: String? = nil) {
            self.dbSubnetGroups = dbSubnetGroups
            self.marker = marker
        }

        private enum CodingKeys: String, CodingKey {
            case dbSubnetGroups = "DBSubnetGroups"
            case marker = "Marker"
        }
    }

    public struct DeleteDBClusterMessage: AWSEncodableShape {
        /// The cluster identifier for the cluster to be deleted. This parameter isn't case sensitive. Constraints:   Must match an existing DBClusterIdentifier.
        public let dbClusterIdentifier: String
        ///  The cluster snapshot identifier of the new cluster snapshot created when SkipFinalSnapshot is set to false.   Specifying this parameter and also setting the SkipFinalShapshot parameter to true results in an error.   Constraints:   Must be from 1 to 255 letters, numbers, or hyphens.   The first character must be a letter.   Cannot end with a hyphen or contain two consecutive hyphens.
        public let finalDBSnapshotIdentifier: String?
        ///  Determines whether a final cluster snapshot is created before the cluster is deleted. If true is specified, no cluster snapshot is created. If false is specified, a cluster snapshot is created before the DB cluster is deleted.   If SkipFinalSnapshot is false, you must specify a FinalDBSnapshotIdentifier parameter.  Default: false
        public let skipFinalSnapshot: Bool?

        public init(dbClusterIdentifier: String, finalDBSnapshotIdentifier: String? = nil, skipFinalSnapshot: Bool? = nil) {
            self.dbClusterIdentifier = dbClusterIdentifier
            self.finalDBSnapshotIdentifier = finalDBSnapshotIdentifier
            self.skipFinalSnapshot = skipFinalSnapshot
        }

        private enum CodingKeys: String, CodingKey {
            case dbClusterIdentifier = "DBClusterIdentifier"
            case finalDBSnapshotIdentifier = "FinalDBSnapshotIdentifier"
            case skipFinalSnapshot = "SkipFinalSnapshot"
        }
    }

    public struct DeleteDBClusterParameterGroupMessage: AWSEncodableShape {
        /// The name of the cluster parameter group. Constraints:   Must be the name of an existing cluster parameter group.   You can't delete a default cluster parameter group.   Cannot be associated with any clusters.
        public let dbClusterParameterGroupName: String

        public init(dbClusterParameterGroupName: String) {
            self.dbClusterParameterGroupName = dbClusterParameterGroupName
        }

        private enum CodingKeys: String, CodingKey {
            case dbClusterParameterGroupName = "DBClusterParameterGroupName"
        }
    }

    public struct DeleteDBClusterResult: AWSDecodableShape {
        public let dbCluster: DBCluster?

        public init(dbCluster: DBCluster? = nil) {
            self.dbCluster = dbCluster
        }

        private enum CodingKeys: String, CodingKey {
            case dbCluster = "DBCluster"
        }
    }

    public struct DeleteDBClusterSnapshotMessage: AWSEncodableShape {
        /// The identifier of the cluster snapshot to delete. Constraints: Must be the name of an existing cluster snapshot in the available state.
        public let dbClusterSnapshotIdentifier: String

        public init(dbClusterSnapshotIdentifier: String) {
            self.dbClusterSnapshotIdentifier = dbClusterSnapshotIdentifier
        }

        private enum CodingKeys: String, CodingKey {
            case dbClusterSnapshotIdentifier = "DBClusterSnapshotIdentifier"
        }
    }

    public struct DeleteDBClusterSnapshotResult: AWSDecodableShape {
        public let dbClusterSnapshot: DBClusterSnapshot?

        public init(dbClusterSnapshot: DBClusterSnapshot? = nil) {
            self.dbClusterSnapshot = dbClusterSnapshot
        }

        private enum CodingKeys: String, CodingKey {
            case dbClusterSnapshot = "DBClusterSnapshot"
        }
    }

    public struct DeleteDBInstanceMessage: AWSEncodableShape {
        /// The instance identifier for the instance to be deleted. This parameter isn't case sensitive. Constraints:   Must match the name of an existing instance.
        public let dbInstanceIdentifier: String

        public init(dbInstanceIdentifier: String) {
            self.dbInstanceIdentifier = dbInstanceIdentifier
        }

        private enum CodingKeys: String, CodingKey {
            case dbInstanceIdentifier = "DBInstanceIdentifier"
        }
    }

    public struct DeleteDBInstanceResult: AWSDecodableShape {
        public let dbInstance: DBInstance?

        public init(dbInstance: DBInstance? = nil) {
            self.dbInstance = dbInstance
        }

        private enum CodingKeys: String, CodingKey {
            case dbInstance = "DBInstance"
        }
    }

    public struct DeleteDBSubnetGroupMessage: AWSEncodableShape {
        /// The name of the database subnet group to delete.  You can't delete the default subnet group.  Constraints: Must match the name of an existing DBSubnetGroup. Must not be default. Example: mySubnetgroup
        public let dbSubnetGroupName: String

        public init(dbSubnetGroupName: String) {
            self.dbSubnetGroupName = dbSubnetGroupName
        }

        private enum CodingKeys: String, CodingKey {
            case dbSubnetGroupName = "DBSubnetGroupName"
        }
    }

    public struct DeleteEventSubscriptionMessage: AWSEncodableShape {
        /// The name of the Amazon DocumentDB event notification subscription that you want to delete.
        public let subscriptionName: String

        public init(subscriptionName: String) {
            self.subscriptionName = subscriptionName
        }

        private enum CodingKeys: String, CodingKey {
            case subscriptionName = "SubscriptionName"
        }
    }

    public struct DeleteEventSubscriptionResult: AWSDecodableShape {
        public let eventSubscription: EventSubscription?

        public init(eventSubscription: EventSubscription? = nil) {
            self.eventSubscription = eventSubscription
        }

        private enum CodingKeys: String, CodingKey {
            case eventSubscription = "EventSubscription"
        }
    }

    public struct DeleteGlobalClusterMessage: AWSEncodableShape {
        /// The cluster identifier of the global cluster being deleted.
        public let globalClusterIdentifier: String

        public init(globalClusterIdentifier: String) {
            self.globalClusterIdentifier = globalClusterIdentifier
        }

        public func validate(name: String) throws {
            try self.validate(self.globalClusterIdentifier, name: "globalClusterIdentifier", parent: name, max: 255)
            try self.validate(self.globalClusterIdentifier, name: "globalClusterIdentifier", parent: name, min: 1)
            try self.validate(self.globalClusterIdentifier, name: "globalClusterIdentifier", parent: name, pattern: "^[A-Za-z][0-9A-Za-z-:._]*$")
        }

        private enum CodingKeys: String, CodingKey {
            case globalClusterIdentifier = "GlobalClusterIdentifier"
        }
    }

    public struct DeleteGlobalClusterResult: AWSDecodableShape {
        public let globalCluster: GlobalCluster?

        public init(globalCluster: GlobalCluster? = nil) {
            self.globalCluster = globalCluster
        }

        private enum CodingKeys: String, CodingKey {
            case globalCluster = "GlobalCluster"
        }
    }

    public struct DescribeCertificatesMessage: AWSEncodableShape {
        public struct _FiltersEncoding: ArrayCoderProperties { public static let member = "Filter" }

        /// The user-supplied certificate identifier. If this parameter is specified, information for only the specified certificate is returned. If this parameter is omitted, a list of up to MaxRecords certificates is returned. This parameter is not case sensitive. Constraints   Must match an existing CertificateIdentifier.
        public let certificateIdentifier: String?
        /// This parameter is not currently supported.
        @OptionalCustomCoding<ArrayCoder<_FiltersEncoding, Filter>>
        public var filters: [Filter]?
        /// An optional pagination token provided by a previous DescribeCertificates request. If this parameter is specified, the response includes only records beyond the marker, up to the value specified by MaxRecords.
        public let marker: String?
        /// The maximum number of records to include in the response. If more records exist than the specified MaxRecords value, a pagination token called a marker is included in the response so that the remaining results can be retrieved. Default: 100 Constraints:   Minimum: 20   Maximum: 100
        public let maxRecords: Int?

        public init(certificateIdentifier: String? = nil, filters: [Filter]? = nil, marker: String? = nil, maxRecords: Int? = nil) {
            self.certificateIdentifier = certificateIdentifier
            self.filters = filters
            self.marker = marker
            self.maxRecords = maxRecords
        }

        private enum CodingKeys: String, CodingKey {
            case certificateIdentifier = "CertificateIdentifier"
            case filters = "Filters"
            case marker = "Marker"
            case maxRecords = "MaxRecords"
        }
    }

    public struct DescribeDBClusterParameterGroupsMessage: AWSEncodableShape {
        public struct _FiltersEncoding: ArrayCoderProperties { public static let member = "Filter" }

        /// The name of a specific cluster parameter group to return details for. Constraints:   If provided, must match the name of an existing DBClusterParameterGroup.
        public let dbClusterParameterGroupName: String?
        /// This parameter is not currently supported.
        @OptionalCustomCoding<ArrayCoder<_FiltersEncoding, Filter>>
        public var filters: [Filter]?
        /// An optional pagination token provided by a previous request. If this parameter is specified, the response includes only records beyond the marker, up to the value specified by MaxRecords.
        public let marker: String?
        ///  The maximum number of records to include in the response. If more records exist than the specified MaxRecords value, a pagination token (marker) is included in the response so that the remaining results can be retrieved. Default: 100 Constraints: Minimum 20, maximum 100.
        public let maxRecords: Int?

        public init(dbClusterParameterGroupName: String? = nil, filters: [Filter]? = nil, marker: String? = nil, maxRecords: Int? = nil) {
            self.dbClusterParameterGroupName = dbClusterParameterGroupName
            self.filters = filters
            self.marker = marker
            self.maxRecords = maxRecords
        }

        private enum CodingKeys: String, CodingKey {
            case dbClusterParameterGroupName = "DBClusterParameterGroupName"
            case filters = "Filters"
            case marker = "Marker"
            case maxRecords = "MaxRecords"
        }
    }

    public struct DescribeDBClusterParametersMessage: AWSEncodableShape {
        public struct _FiltersEncoding: ArrayCoderProperties { public static let member = "Filter" }

        /// The name of a specific cluster parameter group to return parameter details for. Constraints:   If provided, must match the name of an existing DBClusterParameterGroup.
        public let dbClusterParameterGroupName: String
        /// This parameter is not currently supported.
        @OptionalCustomCoding<ArrayCoder<_FiltersEncoding, Filter>>
        public var filters: [Filter]?
        /// An optional pagination token provided by a previous request. If this parameter is specified, the response includes only records beyond the marker, up to the value specified by MaxRecords.
        public let marker: String?
        ///  The maximum number of records to include in the response. If more records exist than the specified MaxRecords value, a pagination token (marker) is included in the response so that the remaining results can be retrieved. Default: 100 Constraints: Minimum 20, maximum 100.
        public let maxRecords: Int?
        ///  A value that indicates to return only parameters for a specific source. Parameter sources can be engine, service, or customer.
        public let source: String?

        public init(dbClusterParameterGroupName: String, filters: [Filter]? = nil, marker: String? = nil, maxRecords: Int? = nil, source: String? = nil) {
            self.dbClusterParameterGroupName = dbClusterParameterGroupName
            self.filters = filters
            self.marker = marker
            self.maxRecords = maxRecords
            self.source = source
        }

        private enum CodingKeys: String, CodingKey {
            case dbClusterParameterGroupName = "DBClusterParameterGroupName"
            case filters = "Filters"
            case marker = "Marker"
            case maxRecords = "MaxRecords"
            case source = "Source"
        }
    }

    public struct DescribeDBClusterSnapshotAttributesMessage: AWSEncodableShape {
        /// The identifier for the cluster snapshot to describe the attributes for.
        public let dbClusterSnapshotIdentifier: String

        public init(dbClusterSnapshotIdentifier: String) {
            self.dbClusterSnapshotIdentifier = dbClusterSnapshotIdentifier
        }

        private enum CodingKeys: String, CodingKey {
            case dbClusterSnapshotIdentifier = "DBClusterSnapshotIdentifier"
        }
    }

    public struct DescribeDBClusterSnapshotAttributesResult: AWSDecodableShape {
        public let dbClusterSnapshotAttributesResult: DBClusterSnapshotAttributesResult?

        public init(dbClusterSnapshotAttributesResult: DBClusterSnapshotAttributesResult? = nil) {
            self.dbClusterSnapshotAttributesResult = dbClusterSnapshotAttributesResult
        }

        private enum CodingKeys: String, CodingKey {
            case dbClusterSnapshotAttributesResult = "DBClusterSnapshotAttributesResult"
        }
    }

    public struct DescribeDBClusterSnapshotsMessage: AWSEncodableShape {
        public struct _FiltersEncoding: ArrayCoderProperties { public static let member = "Filter" }

        /// The ID of the cluster to retrieve the list of cluster snapshots for. This parameter can't be used with the DBClusterSnapshotIdentifier parameter. This parameter is not case sensitive.  Constraints:   If provided, must match the identifier of an existing DBCluster.
        public let dbClusterIdentifier: String?
        /// A specific cluster snapshot identifier to describe. This parameter can't be used with the DBClusterIdentifier parameter. This value is stored as a lowercase string.  Constraints:   If provided, must match the identifier of an existing DBClusterSnapshot.   If this identifier is for an automated snapshot, the SnapshotType parameter must also be specified.
        public let dbClusterSnapshotIdentifier: String?
        /// This parameter is not currently supported.
        @OptionalCustomCoding<ArrayCoder<_FiltersEncoding, Filter>>
        public var filters: [Filter]?
        /// Set to true to include manual cluster snapshots that are public and can be copied or restored by any Amazon Web Services account, and otherwise false. The default is false.
        public let includePublic: Bool?
        /// Set to true to include shared manual cluster snapshots from other Amazon Web Services accounts that this Amazon Web Services account has been given permission to copy or restore, and otherwise false. The default is false.
        public let includeShared: Bool?
        /// An optional pagination token provided by a previous request. If this parameter is specified, the response includes only records beyond the marker, up to the value specified by MaxRecords.
        public let marker: String?
        ///  The maximum number of records to include in the response. If more records exist than the specified MaxRecords value, a pagination token (marker) is included in the response so that the remaining results can be retrieved. Default: 100 Constraints: Minimum 20, maximum 100.
        public let maxRecords: Int?
        /// The type of cluster snapshots to be returned. You can specify one of the following values:    automated - Return all cluster snapshots that Amazon DocumentDB has automatically created for your Amazon Web Services account.    manual - Return all cluster snapshots that you have manually created for your Amazon Web Services account.    shared - Return all manual cluster snapshots that have been shared to your Amazon Web Services account.    public - Return all cluster snapshots that have been marked as public.   If you don't specify a SnapshotType value, then both automated and manual cluster snapshots are returned. You can include shared cluster snapshots with these results by setting the IncludeShared parameter to true. You can include public cluster snapshots with these results by setting theIncludePublic parameter to true. The IncludeShared and IncludePublic parameters don't apply for SnapshotType values of manual or automated. The IncludePublic parameter doesn't apply when SnapshotType is set to shared. The IncludeShared parameter doesn't apply when SnapshotType is set to public.
        public let snapshotType: String?

        public init(dbClusterIdentifier: String? = nil, dbClusterSnapshotIdentifier: String? = nil, filters: [Filter]? = nil, includePublic: Bool? = nil, includeShared: Bool? = nil, marker: String? = nil, maxRecords: Int? = nil, snapshotType: String? = nil) {
            self.dbClusterIdentifier = dbClusterIdentifier
            self.dbClusterSnapshotIdentifier = dbClusterSnapshotIdentifier
            self.filters = filters
            self.includePublic = includePublic
            self.includeShared = includeShared
            self.marker = marker
            self.maxRecords = maxRecords
            self.snapshotType = snapshotType
        }

        private enum CodingKeys: String, CodingKey {
            case dbClusterIdentifier = "DBClusterIdentifier"
            case dbClusterSnapshotIdentifier = "DBClusterSnapshotIdentifier"
            case filters = "Filters"
            case includePublic = "IncludePublic"
            case includeShared = "IncludeShared"
            case marker = "Marker"
            case maxRecords = "MaxRecords"
            case snapshotType = "SnapshotType"
        }
    }

    public struct DescribeDBClustersMessage: AWSEncodableShape {
        public struct _FiltersEncoding: ArrayCoderProperties { public static let member = "Filter" }

        /// The user-provided cluster identifier. If this parameter is specified, information from only the specific cluster is returned. This parameter isn't case sensitive. Constraints:   If provided, must match an existing DBClusterIdentifier.
        public let dbClusterIdentifier: String?
        /// A filter that specifies one or more clusters to describe. Supported filters:    db-cluster-id - Accepts cluster identifiers and cluster Amazon Resource Names (ARNs). The results list only includes information about the clusters identified by these ARNs.
        @OptionalCustomCoding<ArrayCoder<_FiltersEncoding, Filter>>
        public var filters: [Filter]?
        /// An optional pagination token provided by a previous request. If this parameter is specified, the response includes only records beyond the marker, up to the value specified by MaxRecords.
        public let marker: String?
        ///  The maximum number of records to include in the response. If more records exist than the specified MaxRecords value, a pagination token (marker) is included in the response so that the remaining results can be retrieved. Default: 100 Constraints: Minimum 20, maximum 100.
        public let maxRecords: Int?

        public init(dbClusterIdentifier: String? = nil, filters: [Filter]? = nil, marker: String? = nil, maxRecords: Int? = nil) {
            self.dbClusterIdentifier = dbClusterIdentifier
            self.filters = filters
            self.marker = marker
            self.maxRecords = maxRecords
        }

        private enum CodingKeys: String, CodingKey {
            case dbClusterIdentifier = "DBClusterIdentifier"
            case filters = "Filters"
            case marker = "Marker"
            case maxRecords = "MaxRecords"
        }
    }

    public struct DescribeDBEngineVersionsMessage: AWSEncodableShape {
        public struct _FiltersEncoding: ArrayCoderProperties { public static let member = "Filter" }

        /// The name of a specific parameter group family to return details for. Constraints:   If provided, must match an existing DBParameterGroupFamily.
        public let dbParameterGroupFamily: String?
        /// Indicates that only the default version of the specified engine or engine and major version combination is returned.
        public let defaultOnly: Bool?
        /// The database engine to return.
        public let engine: String?
        /// The database engine version to return. Example: 3.6.0
        public let engineVersion: String?
        /// This parameter is not currently supported.
        @OptionalCustomCoding<ArrayCoder<_FiltersEncoding, Filter>>
        public var filters: [Filter]?
        /// If this parameter is specified and the requested engine supports the CharacterSetName parameter for CreateDBInstance, the response includes a list of supported character sets for each engine version.
        public let listSupportedCharacterSets: Bool?
        /// If this parameter is specified and the requested engine supports the TimeZone parameter for CreateDBInstance, the response includes a list of supported time zones for each engine version.
        public let listSupportedTimezones: Bool?
        /// An optional pagination token provided by a previous request. If this parameter is specified, the response includes only records beyond the marker, up to the value specified by MaxRecords.
        public let marker: String?
        ///  The maximum number of records to include in the response. If more records exist than the specified MaxRecords value, a pagination token (marker) is included in the response so that the remaining results can be retrieved. Default: 100 Constraints: Minimum 20, maximum 100.
        public let maxRecords: Int?

        public init(dbParameterGroupFamily: String? = nil, defaultOnly: Bool? = nil, engine: String? = nil, engineVersion: String? = nil, filters: [Filter]? = nil, listSupportedCharacterSets: Bool? = nil, listSupportedTimezones: Bool? = nil, marker: String? = nil, maxRecords: Int? = nil) {
            self.dbParameterGroupFamily = dbParameterGroupFamily
            self.defaultOnly = defaultOnly
            self.engine = engine
            self.engineVersion = engineVersion
            self.filters = filters
            self.listSupportedCharacterSets = listSupportedCharacterSets
            self.listSupportedTimezones = listSupportedTimezones
            self.marker = marker
            self.maxRecords = maxRecords
        }

        private enum CodingKeys: String, CodingKey {
            case dbParameterGroupFamily = "DBParameterGroupFamily"
            case defaultOnly = "DefaultOnly"
            case engine = "Engine"
            case engineVersion = "EngineVersion"
            case filters = "Filters"
            case listSupportedCharacterSets = "ListSupportedCharacterSets"
            case listSupportedTimezones = "ListSupportedTimezones"
            case marker = "Marker"
            case maxRecords = "MaxRecords"
        }
    }

    public struct DescribeDBInstancesMessage: AWSEncodableShape {
        public struct _FiltersEncoding: ArrayCoderProperties { public static let member = "Filter" }

        /// The user-provided instance identifier. If this parameter is specified, information from only the specific instance is returned. This parameter isn't case sensitive. Constraints:   If provided, must match the identifier of an existing DBInstance.
        public let dbInstanceIdentifier: String?
        /// A filter that specifies one or more instances to describe. Supported filters:    db-cluster-id - Accepts cluster identifiers and cluster Amazon Resource Names (ARNs). The results list includes only the information about the instances that are associated with the clusters that are identified by these ARNs.    db-instance-id - Accepts instance identifiers and instance ARNs. The results list includes only the information about the instances that are identified by these ARNs.
        @OptionalCustomCoding<ArrayCoder<_FiltersEncoding, Filter>>
        public var filters: [Filter]?
        /// An optional pagination token provided by a previous request. If this parameter is specified, the response includes only records beyond the marker, up to the value specified by MaxRecords.
        public let marker: String?
        ///  The maximum number of records to include in the response. If more records exist than the specified MaxRecords value, a pagination token (marker) is included in the response so that the remaining results can be retrieved. Default: 100 Constraints: Minimum 20, maximum 100.
        public let maxRecords: Int?

        public init(dbInstanceIdentifier: String? = nil, filters: [Filter]? = nil, marker: String? = nil, maxRecords: Int? = nil) {
            self.dbInstanceIdentifier = dbInstanceIdentifier
            self.filters = filters
            self.marker = marker
            self.maxRecords = maxRecords
        }

        private enum CodingKeys: String, CodingKey {
            case dbInstanceIdentifier = "DBInstanceIdentifier"
            case filters = "Filters"
            case marker = "Marker"
            case maxRecords = "MaxRecords"
        }
    }

    public struct DescribeDBSubnetGroupsMessage: AWSEncodableShape {
        public struct _FiltersEncoding: ArrayCoderProperties { public static let member = "Filter" }

        /// The name of the subnet group to return details for.
        public let dbSubnetGroupName: String?
        /// This parameter is not currently supported.
        @OptionalCustomCoding<ArrayCoder<_FiltersEncoding, Filter>>
        public var filters: [Filter]?
        /// An optional pagination token provided by a previous request. If this parameter is specified, the response includes only records beyond the marker, up to the value specified by MaxRecords.
        public let marker: String?
        ///  The maximum number of records to include in the response. If more records exist than the specified MaxRecords value, a pagination token (marker) is included in the response so that the remaining results can be retrieved. Default: 100 Constraints: Minimum 20, maximum 100.
        public let maxRecords: Int?

        public init(dbSubnetGroupName: String? = nil, filters: [Filter]? = nil, marker: String? = nil, maxRecords: Int? = nil) {
            self.dbSubnetGroupName = dbSubnetGroupName
            self.filters = filters
            self.marker = marker
            self.maxRecords = maxRecords
        }

        private enum CodingKeys: String, CodingKey {
            case dbSubnetGroupName = "DBSubnetGroupName"
            case filters = "Filters"
            case marker = "Marker"
            case maxRecords = "MaxRecords"
        }
    }

    public struct DescribeEngineDefaultClusterParametersMessage: AWSEncodableShape {
        public struct _FiltersEncoding: ArrayCoderProperties { public static let member = "Filter" }

        /// The name of the cluster parameter group family to return the engine parameter information for.
        public let dbParameterGroupFamily: String
        /// This parameter is not currently supported.
        @OptionalCustomCoding<ArrayCoder<_FiltersEncoding, Filter>>
        public var filters: [Filter]?
        /// An optional pagination token provided by a previous request. If this parameter is specified, the response includes only records beyond the marker, up to the value specified by MaxRecords.
        public let marker: String?
        ///  The maximum number of records to include in the response. If more records exist than the specified MaxRecords value, a pagination token (marker) is included in the response so that the remaining results can be retrieved. Default: 100 Constraints: Minimum 20, maximum 100.
        public let maxRecords: Int?

        public init(dbParameterGroupFamily: String, filters: [Filter]? = nil, marker: String? = nil, maxRecords: Int? = nil) {
            self.dbParameterGroupFamily = dbParameterGroupFamily
            self.filters = filters
            self.marker = marker
            self.maxRecords = maxRecords
        }

        private enum CodingKeys: String, CodingKey {
            case dbParameterGroupFamily = "DBParameterGroupFamily"
            case filters = "Filters"
            case marker = "Marker"
            case maxRecords = "MaxRecords"
        }
    }

    public struct DescribeEngineDefaultClusterParametersResult: AWSDecodableShape {
        public let engineDefaults: EngineDefaults?

        public init(engineDefaults: EngineDefaults? = nil) {
            self.engineDefaults = engineDefaults
        }

        private enum CodingKeys: String, CodingKey {
            case engineDefaults = "EngineDefaults"
        }
    }

    public struct DescribeEventCategoriesMessage: AWSEncodableShape {
        public struct _FiltersEncoding: ArrayCoderProperties { public static let member = "Filter" }

        /// This parameter is not currently supported.
        @OptionalCustomCoding<ArrayCoder<_FiltersEncoding, Filter>>
        public var filters: [Filter]?
        /// The type of source that is generating the events. Valid values: db-instance, db-parameter-group, db-security-group
        public let sourceType: String?

        public init(filters: [Filter]? = nil, sourceType: String? = nil) {
            self.filters = filters
            self.sourceType = sourceType
        }

        private enum CodingKeys: String, CodingKey {
            case filters = "Filters"
            case sourceType = "SourceType"
        }
    }

    public struct DescribeEventSubscriptionsMessage: AWSEncodableShape {
        public struct _FiltersEncoding: ArrayCoderProperties { public static let member = "Filter" }

        /// This parameter is not currently supported.
        @OptionalCustomCoding<ArrayCoder<_FiltersEncoding, Filter>>
        public var filters: [Filter]?
        /// An optional pagination token provided by a previous request. If this parameter is specified, the response includes only records beyond the marker, up to the value specified by MaxRecords.
        public let marker: String?
        ///  The maximum number of records to include in the response. If more records exist than the specified MaxRecords value, a pagination token (marker) is included in the response so that the remaining results can be retrieved. Default: 100 Constraints: Minimum 20, maximum 100.
        public let maxRecords: Int?
        /// The name of the Amazon DocumentDB event notification subscription that you want to describe.
        public let subscriptionName: String?

        public init(filters: [Filter]? = nil, marker: String? = nil, maxRecords: Int? = nil, subscriptionName: String? = nil) {
            self.filters = filters
            self.marker = marker
            self.maxRecords = maxRecords
            self.subscriptionName = subscriptionName
        }

        private enum CodingKeys: String, CodingKey {
            case filters = "Filters"
            case marker = "Marker"
            case maxRecords = "MaxRecords"
            case subscriptionName = "SubscriptionName"
        }
    }

    public struct DescribeEventsMessage: AWSEncodableShape {
        public struct _EventCategoriesEncoding: ArrayCoderProperties { public static let member = "EventCategory" }
        public struct _FiltersEncoding: ArrayCoderProperties { public static let member = "Filter" }

        /// The number of minutes to retrieve events for. Default: 60
        public let duration: Int?
        ///  The end of the time interval for which to retrieve events, specified in ISO 8601 format.  Example: 2009-07-08T18:00Z
        public let endTime: Date?
        /// A list of event categories that trigger notifications for an event notification subscription.
        @OptionalCustomCoding<ArrayCoder<_EventCategoriesEncoding, String>>
        public var eventCategories: [String]?
        /// This parameter is not currently supported.
        @OptionalCustomCoding<ArrayCoder<_FiltersEncoding, Filter>>
        public var filters: [Filter]?
        /// An optional pagination token provided by a previous request. If this parameter is specified, the response includes only records beyond the marker, up to the value specified by MaxRecords.
        public let marker: String?
        ///  The maximum number of records to include in the response. If more records exist than the specified MaxRecords value, a pagination token (marker) is included in the response so that the remaining results can be retrieved. Default: 100 Constraints: Minimum 20, maximum 100.
        public let maxRecords: Int?
        /// The identifier of the event source for which events are returned. If not specified, then all sources are included in the response. Constraints:   If SourceIdentifier is provided, SourceType must also be provided.   If the source type is DBInstance, a DBInstanceIdentifier must be provided.   If the source type is DBSecurityGroup, a DBSecurityGroupName must be provided.   If the source type is DBParameterGroup, a DBParameterGroupName must be provided.   If the source type is DBSnapshot, a DBSnapshotIdentifier must be provided.   Cannot end with a hyphen or contain two consecutive hyphens.
        public let sourceIdentifier: String?
        /// The event source to retrieve events for. If no value is specified, all events are returned.
        public let sourceType: SourceType?
        ///  The beginning of the time interval to retrieve events for, specified in ISO 8601 format.  Example: 2009-07-08T18:00Z
        public let startTime: Date?

        public init(duration: Int? = nil, endTime: Date? = nil, eventCategories: [String]? = nil, filters: [Filter]? = nil, marker: String? = nil, maxRecords: Int? = nil, sourceIdentifier: String? = nil, sourceType: SourceType? = nil, startTime: Date? = nil) {
            self.duration = duration
            self.endTime = endTime
            self.eventCategories = eventCategories
            self.filters = filters
            self.marker = marker
            self.maxRecords = maxRecords
            self.sourceIdentifier = sourceIdentifier
            self.sourceType = sourceType
            self.startTime = startTime
        }

        private enum CodingKeys: String, CodingKey {
            case duration = "Duration"
            case endTime = "EndTime"
            case eventCategories = "EventCategories"
            case filters = "Filters"
            case marker = "Marker"
            case maxRecords = "MaxRecords"
            case sourceIdentifier = "SourceIdentifier"
            case sourceType = "SourceType"
            case startTime = "StartTime"
        }
    }

    public struct DescribeGlobalClustersMessage: AWSEncodableShape {
        public struct _FiltersEncoding: ArrayCoderProperties { public static let member = "Filter" }

        /// A filter that specifies one or more global DB clusters to describe. Supported filters: db-cluster-id accepts  cluster identifiers and  cluster Amazon Resource Names (ARNs). The results list will only include information about the clusters identified by these ARNs.
        @OptionalCustomCoding<ArrayCoder<_FiltersEncoding, Filter>>
        public var filters: [Filter]?
        /// The user-supplied  cluster identifier. If this parameter is specified, information from only the specific cluster is returned. This parameter isn't case-sensitive.
        public let globalClusterIdentifier: String?
        /// An optional pagination token provided by a previous DescribeGlobalClusters request. If this parameter is specified, the response includes only records beyond the marker, up to the value specified by MaxRecords.
        public let marker: String?
        /// The maximum number of records to include in the response. If more records exist than the specified MaxRecords value, a pagination token called a marker is included in the response so that you can retrieve the remaining results.
        public let maxRecords: Int?

        public init(filters: [Filter]? = nil, globalClusterIdentifier: String? = nil, marker: String? = nil, maxRecords: Int? = nil) {
            self.filters = filters
            self.globalClusterIdentifier = globalClusterIdentifier
            self.marker = marker
            self.maxRecords = maxRecords
        }

        public func validate(name: String) throws {
            try self.validate(self.globalClusterIdentifier, name: "globalClusterIdentifier", parent: name, max: 255)
            try self.validate(self.globalClusterIdentifier, name: "globalClusterIdentifier", parent: name, min: 1)
            try self.validate(self.globalClusterIdentifier, name: "globalClusterIdentifier", parent: name, pattern: "^[A-Za-z][0-9A-Za-z-:._]*$")
        }

        private enum CodingKeys: String, CodingKey {
            case filters = "Filters"
            case globalClusterIdentifier = "GlobalClusterIdentifier"
            case marker = "Marker"
            case maxRecords = "MaxRecords"
        }
    }

    public struct DescribeOrderableDBInstanceOptionsMessage: AWSEncodableShape {
        public struct _FiltersEncoding: ArrayCoderProperties { public static let member = "Filter" }

        /// The instance class filter value. Specify this parameter to show only the available offerings that match the specified instance class.
        public let dbInstanceClass: String?
        /// The name of the engine to retrieve instance options for.
        public let engine: String
        /// The engine version filter value. Specify this parameter to show only the available offerings that match the specified engine version.
        public let engineVersion: String?
        /// This parameter is not currently supported.
        @OptionalCustomCoding<ArrayCoder<_FiltersEncoding, Filter>>
        public var filters: [Filter]?
        /// The license model filter value. Specify this parameter to show only the available offerings that match the specified license model.
        public let licenseModel: String?
        /// An optional pagination token provided by a previous request. If this parameter is specified, the response includes only records beyond the marker, up to the value specified by MaxRecords.
        public let marker: String?
        ///  The maximum number of records to include in the response. If more records exist than the specified MaxRecords value, a pagination token (marker) is included in the response so that the remaining results can be retrieved. Default: 100 Constraints: Minimum 20, maximum 100.
        public let maxRecords: Int?
        /// The virtual private cloud (VPC) filter value. Specify this parameter to show only the available VPC or non-VPC offerings.
        public let vpc: Bool?

        public init(dbInstanceClass: String? = nil, engine: String, engineVersion: String? = nil, filters: [Filter]? = nil, licenseModel: String? = nil, marker: String? = nil, maxRecords: Int? = nil, vpc: Bool? = nil) {
            self.dbInstanceClass = dbInstanceClass
            self.engine = engine
            self.engineVersion = engineVersion
            self.filters = filters
            self.licenseModel = licenseModel
            self.marker = marker
            self.maxRecords = maxRecords
            self.vpc = vpc
        }

        private enum CodingKeys: String, CodingKey {
            case dbInstanceClass = "DBInstanceClass"
            case engine = "Engine"
            case engineVersion = "EngineVersion"
            case filters = "Filters"
            case licenseModel = "LicenseModel"
            case marker = "Marker"
            case maxRecords = "MaxRecords"
            case vpc = "Vpc"
        }
    }

    public struct DescribePendingMaintenanceActionsMessage: AWSEncodableShape {
        public struct _FiltersEncoding: ArrayCoderProperties { public static let member = "Filter" }

        /// A filter that specifies one or more resources to return pending maintenance actions for. Supported filters:    db-cluster-id - Accepts cluster identifiers and cluster Amazon Resource Names (ARNs). The results list includes only pending maintenance actions for the clusters identified by these ARNs.    db-instance-id - Accepts instance identifiers and instance ARNs. The results list includes only pending maintenance actions for the DB instances identified by these ARNs.
        @OptionalCustomCoding<ArrayCoder<_FiltersEncoding, Filter>>
        public var filters: [Filter]?
        /// An optional pagination token provided by a previous request. If this parameter is specified, the response includes only records beyond the marker, up to the value specified by MaxRecords.
        public let marker: String?
        ///  The maximum number of records to include in the response. If more records exist than the specified MaxRecords value, a pagination token (marker) is included in the response so that the remaining results can be retrieved. Default: 100 Constraints: Minimum 20, maximum 100.
        public let maxRecords: Int?
        /// The ARN of a resource to return pending maintenance actions for.
        public let resourceIdentifier: String?

        public init(filters: [Filter]? = nil, marker: String? = nil, maxRecords: Int? = nil, resourceIdentifier: String? = nil) {
            self.filters = filters
            self.marker = marker
            self.maxRecords = maxRecords
            self.resourceIdentifier = resourceIdentifier
        }

        private enum CodingKeys: String, CodingKey {
            case filters = "Filters"
            case marker = "Marker"
            case maxRecords = "MaxRecords"
            case resourceIdentifier = "ResourceIdentifier"
        }
    }

    public struct Endpoint: AWSDecodableShape {
        /// Specifies the DNS address of the instance.
        public let address: String?
        /// Specifies the ID that Amazon Route 53 assigns when you create a hosted zone.
        public let hostedZoneId: String?
        /// Specifies the port that the database engine is listening on.
        public let port: Int?

        public init(address: String? = nil, hostedZoneId: String? = nil, port: Int? = nil) {
            self.address = address
            self.hostedZoneId = hostedZoneId
            self.port = port
        }

        private enum CodingKeys: String, CodingKey {
            case address = "Address"
            case hostedZoneId = "HostedZoneId"
            case port = "Port"
        }
    }

    public struct EngineDefaults: AWSDecodableShape {
        public struct _ParametersEncoding: ArrayCoderProperties { public static let member = "Parameter" }

        /// The name of the cluster parameter group family to return the engine parameter information for.
        public let dbParameterGroupFamily: String?
        /// An optional pagination token provided by a previous request. If this parameter is specified, the response includes only records beyond the marker, up to the value specified by MaxRecords.
        public let marker: String?
        /// The parameters of a particular cluster parameter group family.
        @OptionalCustomCoding<ArrayCoder<_ParametersEncoding, Parameter>>
        public var parameters: [Parameter]?

        public init(dbParameterGroupFamily: String? = nil, marker: String? = nil, parameters: [Parameter]? = nil) {
            self.dbParameterGroupFamily = dbParameterGroupFamily
            self.marker = marker
            self.parameters = parameters
        }

        private enum CodingKeys: String, CodingKey {
            case dbParameterGroupFamily = "DBParameterGroupFamily"
            case marker = "Marker"
            case parameters = "Parameters"
        }
    }

    public struct Event: AWSDecodableShape {
        public struct _EventCategoriesEncoding: ArrayCoderProperties { public static let member = "EventCategory" }

        /// Specifies the date and time of the event.
        public let date: Date?
        /// Specifies the category for the event.
        @OptionalCustomCoding<ArrayCoder<_EventCategoriesEncoding, String>>
        public var eventCategories: [String]?
        /// Provides the text of this event.
        public let message: String?
        /// The Amazon Resource Name (ARN) for the event.
        public let sourceArn: String?
        /// Provides the identifier for the source of the event.
        public let sourceIdentifier: String?
        /// Specifies the source type for this event.
        public let sourceType: SourceType?

        public init(date: Date? = nil, eventCategories: [String]? = nil, message: String? = nil, sourceArn: String? = nil, sourceIdentifier: String? = nil, sourceType: SourceType? = nil) {
            self.date = date
            self.eventCategories = eventCategories
            self.message = message
            self.sourceArn = sourceArn
            self.sourceIdentifier = sourceIdentifier
            self.sourceType = sourceType
        }

        private enum CodingKeys: String, CodingKey {
            case date = "Date"
            case eventCategories = "EventCategories"
            case message = "Message"
            case sourceArn = "SourceArn"
            case sourceIdentifier = "SourceIdentifier"
            case sourceType = "SourceType"
        }
    }

    public struct EventCategoriesMap: AWSDecodableShape {
        public struct _EventCategoriesEncoding: ArrayCoderProperties { public static let member = "EventCategory" }

        /// The event categories for the specified source type.
        @OptionalCustomCoding<ArrayCoder<_EventCategoriesEncoding, String>>
        public var eventCategories: [String]?
        /// The source type that the returned categories belong to.
        public let sourceType: String?

        public init(eventCategories: [String]? = nil, sourceType: String? = nil) {
            self.eventCategories = eventCategories
            self.sourceType = sourceType
        }

        private enum CodingKeys: String, CodingKey {
            case eventCategories = "EventCategories"
            case sourceType = "SourceType"
        }
    }

    public struct EventCategoriesMessage: AWSDecodableShape {
        public struct _EventCategoriesMapListEncoding: ArrayCoderProperties { public static let member = "EventCategoriesMap" }

        /// A list of event category maps.
        @OptionalCustomCoding<ArrayCoder<_EventCategoriesMapListEncoding, EventCategoriesMap>>
        public var eventCategoriesMapList: [EventCategoriesMap]?

        public init(eventCategoriesMapList: [EventCategoriesMap]? = nil) {
            self.eventCategoriesMapList = eventCategoriesMapList
        }

        private enum CodingKeys: String, CodingKey {
            case eventCategoriesMapList = "EventCategoriesMapList"
        }
    }

    public struct EventSubscription: AWSDecodableShape {
        public struct _EventCategoriesListEncoding: ArrayCoderProperties { public static let member = "EventCategory" }
        public struct _SourceIdsListEncoding: ArrayCoderProperties { public static let member = "SourceId" }

        /// The Amazon Web Services customer account that is associated with the Amazon DocumentDB event notification subscription.
        public let customerAwsId: String?
        /// The Amazon DocumentDB event notification subscription ID.
        public let custSubscriptionId: String?
        /// A Boolean value indicating whether the subscription is enabled. A value of true indicates that the subscription is enabled.
        public let enabled: Bool?
        /// A list of event categories for the Amazon DocumentDB event notification subscription.
        @OptionalCustomCoding<ArrayCoder<_EventCategoriesListEncoding, String>>
        public var eventCategoriesList: [String]?
        /// The Amazon Resource Name (ARN) for the event subscription.
        public let eventSubscriptionArn: String?
        /// The topic ARN of the Amazon DocumentDB event notification subscription.
        public let snsTopicArn: String?
        /// A list of source IDs for the Amazon DocumentDB event notification subscription.
        @OptionalCustomCoding<ArrayCoder<_SourceIdsListEncoding, String>>
        public var sourceIdsList: [String]?
        /// The source type for the Amazon DocumentDB event notification subscription.
        public let sourceType: String?
        /// The status of the Amazon DocumentDB event notification subscription. Constraints: Can be one of the following: creating, modifying, deleting, active, no-permission, topic-not-exist  The no-permission status indicates that Amazon DocumentDB no longer has permission to post to the SNS topic. The topic-not-exist status indicates that the topic was deleted after the subscription was created.
        public let status: String?
        /// The time at which the Amazon DocumentDB event notification subscription was created.
        public let subscriptionCreationTime: String?

        public init(customerAwsId: String? = nil, custSubscriptionId: String? = nil, enabled: Bool? = nil, eventCategoriesList: [String]? = nil, eventSubscriptionArn: String? = nil, snsTopicArn: String? = nil, sourceIdsList: [String]? = nil, sourceType: String? = nil, status: String? = nil, subscriptionCreationTime: String? = nil) {
            self.customerAwsId = customerAwsId
            self.custSubscriptionId = custSubscriptionId
            self.enabled = enabled
            self.eventCategoriesList = eventCategoriesList
            self.eventSubscriptionArn = eventSubscriptionArn
            self.snsTopicArn = snsTopicArn
            self.sourceIdsList = sourceIdsList
            self.sourceType = sourceType
            self.status = status
            self.subscriptionCreationTime = subscriptionCreationTime
        }

        private enum CodingKeys: String, CodingKey {
            case customerAwsId = "CustomerAwsId"
            case custSubscriptionId = "CustSubscriptionId"
            case enabled = "Enabled"
            case eventCategoriesList = "EventCategoriesList"
            case eventSubscriptionArn = "EventSubscriptionArn"
            case snsTopicArn = "SnsTopicArn"
            case sourceIdsList = "SourceIdsList"
            case sourceType = "SourceType"
            case status = "Status"
            case subscriptionCreationTime = "SubscriptionCreationTime"
        }
    }

    public struct EventSubscriptionsMessage: AWSDecodableShape {
        public struct _EventSubscriptionsListEncoding: ArrayCoderProperties { public static let member = "EventSubscription" }

        /// A list of event subscriptions.
        @OptionalCustomCoding<ArrayCoder<_EventSubscriptionsListEncoding, EventSubscription>>
        public var eventSubscriptionsList: [EventSubscription]?
        /// An optional pagination token provided by a previous request. If this parameter is specified, the response includes only records beyond the marker, up to the value specified by MaxRecords.
        public let marker: String?

        public init(eventSubscriptionsList: [EventSubscription]? = nil, marker: String? = nil) {
            self.eventSubscriptionsList = eventSubscriptionsList
            self.marker = marker
        }

        private enum CodingKeys: String, CodingKey {
            case eventSubscriptionsList = "EventSubscriptionsList"
            case marker = "Marker"
        }
    }

    public struct EventsMessage: AWSDecodableShape {
        public struct _EventsEncoding: ArrayCoderProperties { public static let member = "Event" }

        /// Detailed information about one or more events.
        @OptionalCustomCoding<ArrayCoder<_EventsEncoding, Event>>
        public var events: [Event]?
        /// An optional pagination token provided by a previous request. If this parameter is specified, the response includes only records beyond the marker, up to the value specified by MaxRecords.
        public let marker: String?

        public init(events: [Event]? = nil, marker: String? = nil) {
            self.events = events
            self.marker = marker
        }

        private enum CodingKeys: String, CodingKey {
            case events = "Events"
            case marker = "Marker"
        }
    }

    public struct FailoverDBClusterMessage: AWSEncodableShape {
        /// A cluster identifier to force a failover for. This parameter is not case sensitive. Constraints:   Must match the identifier of an existing DBCluster.
        public let dbClusterIdentifier: String?
        /// The name of the instance to promote to the primary instance. You must specify the instance identifier for an Amazon DocumentDB replica in the cluster. For example, mydbcluster-replica1.
        public let targetDBInstanceIdentifier: String?

        public init(dbClusterIdentifier: String? = nil, targetDBInstanceIdentifier: String? = nil) {
            self.dbClusterIdentifier = dbClusterIdentifier
            self.targetDBInstanceIdentifier = targetDBInstanceIdentifier
        }

        private enum CodingKeys: String, CodingKey {
            case dbClusterIdentifier = "DBClusterIdentifier"
            case targetDBInstanceIdentifier = "TargetDBInstanceIdentifier"
        }
    }

    public struct FailoverDBClusterResult: AWSDecodableShape {
        public let dbCluster: DBCluster?

        public init(dbCluster: DBCluster? = nil) {
            self.dbCluster = dbCluster
        }

        private enum CodingKeys: String, CodingKey {
            case dbCluster = "DBCluster"
        }
    }

    public struct Filter: AWSEncodableShape {
        public struct _ValuesEncoding: ArrayCoderProperties { public static let member = "Value" }

        /// The name of the filter. Filter names are case sensitive.
        public let name: String
        /// One or more filter values. Filter values are case sensitive.
        @CustomCoding<ArrayCoder<_ValuesEncoding, String>>
        public var values: [String]

        public init(name: String, values: [String]) {
            self.name = name
            self.values = values
        }

        private enum CodingKeys: String, CodingKey {
            case name = "Name"
            case values = "Values"
        }
    }

    public struct GlobalCluster: AWSDecodableShape {
        public struct _GlobalClusterMembersEncoding: ArrayCoderProperties { public static let member = "GlobalClusterMember" }

        /// The default database name within the new global cluster.
        public let databaseName: String?
        /// The deletion protection setting for the new global cluster.
        public let deletionProtection: Bool?
        /// The Amazon DocumentDB database engine used by the global cluster.
        public let engine: String?
        /// Indicates the database engine version.
        public let engineVersion: String?
        /// The Amazon Resource Name (ARN) for the global cluster.
        public let globalClusterArn: String?
        /// Contains a user-supplied global  cluster identifier. This identifier is the unique key that identifies a global cluster.
        public let globalClusterIdentifier: String?
        /// The list of cluster IDs for secondary clusters within the global cluster. Currently limited to one item.
        @OptionalCustomCoding<ArrayCoder<_GlobalClusterMembersEncoding, GlobalClusterMember>>
        public var globalClusterMembers: [GlobalClusterMember]?
        /// The Amazon Web Services Region-unique, immutable identifier for the global database cluster. This identifier is found in AWS CloudTrail log entries whenever the AWS KMS customer master key (CMK) for the cluster is accessed.
        public let globalClusterResourceId: String?
        /// Specifies the current state of this global cluster.
        public let status: String?
        /// The storage encryption setting for the global cluster.
        public let storageEncrypted: Bool?

        public init(databaseName: String? = nil, deletionProtection: Bool? = nil, engine: String? = nil, engineVersion: String? = nil, globalClusterArn: String? = nil, globalClusterIdentifier: String? = nil, globalClusterMembers: [GlobalClusterMember]? = nil, globalClusterResourceId: String? = nil, status: String? = nil, storageEncrypted: Bool? = nil) {
            self.databaseName = databaseName
            self.deletionProtection = deletionProtection
            self.engine = engine
            self.engineVersion = engineVersion
            self.globalClusterArn = globalClusterArn
            self.globalClusterIdentifier = globalClusterIdentifier
            self.globalClusterMembers = globalClusterMembers
            self.globalClusterResourceId = globalClusterResourceId
            self.status = status
            self.storageEncrypted = storageEncrypted
        }

        private enum CodingKeys: String, CodingKey {
            case databaseName = "DatabaseName"
            case deletionProtection = "DeletionProtection"
            case engine = "Engine"
            case engineVersion = "EngineVersion"
            case globalClusterArn = "GlobalClusterArn"
            case globalClusterIdentifier = "GlobalClusterIdentifier"
            case globalClusterMembers = "GlobalClusterMembers"
            case globalClusterResourceId = "GlobalClusterResourceId"
            case status = "Status"
            case storageEncrypted = "StorageEncrypted"
        }
    }

    public struct GlobalClusterMember: AWSDecodableShape {
        /// The Amazon Resource Name (ARN) for each Amazon DocumentDB cluster.
        public let dbClusterArn: String?
        ///  Specifies whether the Amazon DocumentDB cluster is the primary cluster (that is, has read-write capability) for the Amazon DocumentDB global cluster with which it is associated.
        public let isWriter: Bool?
        /// The Amazon Resource Name (ARN) for each read-only secondary cluster associated with the Aurora global cluster.
        @OptionalCustomCoding<StandardArrayCoder>
        public var readers: [String]?

        public init(dbClusterArn: String? = nil, isWriter: Bool? = nil, readers: [String]? = nil) {
            self.dbClusterArn = dbClusterArn
            self.isWriter = isWriter
            self.readers = readers
        }

        private enum CodingKeys: String, CodingKey {
            case dbClusterArn = "DBClusterArn"
            case isWriter = "IsWriter"
            case readers = "Readers"
        }
    }

    public struct GlobalClustersMessage: AWSDecodableShape {
        public struct _GlobalClustersEncoding: ArrayCoderProperties { public static let member = "GlobalClusterMember" }

        @OptionalCustomCoding<ArrayCoder<_GlobalClustersEncoding, GlobalCluster>>
        public var globalClusters: [GlobalCluster]?
        public let marker: String?

        public init(globalClusters: [GlobalCluster]? = nil, marker: String? = nil) {
            self.globalClusters = globalClusters
            self.marker = marker
        }

        private enum CodingKeys: String, CodingKey {
            case globalClusters = "GlobalClusters"
            case marker = "Marker"
        }
    }

    public struct ListTagsForResourceMessage: AWSEncodableShape {
        public struct _FiltersEncoding: ArrayCoderProperties { public static let member = "Filter" }

        /// This parameter is not currently supported.
        @OptionalCustomCoding<ArrayCoder<_FiltersEncoding, Filter>>
        public var filters: [Filter]?
        /// The Amazon DocumentDB resource with tags to be listed. This value is an Amazon Resource Name (ARN).
        public let resourceName: String

        public init(filters: [Filter]? = nil, resourceName: String) {
            self.filters = filters
            self.resourceName = resourceName
        }

        private enum CodingKeys: String, CodingKey {
            case filters = "Filters"
            case resourceName = "ResourceName"
        }
    }

    public struct ModifyDBClusterMessage: AWSEncodableShape {
        public struct _VpcSecurityGroupIdsEncoding: ArrayCoderProperties { public static let member = "VpcSecurityGroupId" }

        /// A value that specifies whether the changes in this request and any pending changes are asynchronously applied as soon as possible, regardless of the PreferredMaintenanceWindow setting for the cluster. If this parameter is set to false, changes to the cluster are applied during the next maintenance window. The ApplyImmediately parameter affects only the NewDBClusterIdentifier and MasterUserPassword values. If you set this parameter value to false, the changes to the NewDBClusterIdentifier and MasterUserPassword values are applied during the next maintenance window. All other changes are applied immediately, regardless of the value of the ApplyImmediately parameter. Default: false
        public let applyImmediately: Bool?
        /// The number of days for which automated backups are retained. You must specify a minimum value of 1. Default: 1 Constraints:   Must be a value from 1 to 35.
        public let backupRetentionPeriod: Int?
        /// The configuration setting for the log types to be enabled for export to Amazon CloudWatch Logs for a specific instance or cluster. The EnableLogTypes and DisableLogTypes arrays determine which logs are exported (or not exported) to CloudWatch Logs.
        public let cloudwatchLogsExportConfiguration: CloudwatchLogsExportConfiguration?
        /// The cluster identifier for the cluster that is being modified. This parameter is not case sensitive. Constraints:   Must match the identifier of an existing DBCluster.
        public let dbClusterIdentifier: String
        /// The name of the cluster parameter group to use for the cluster.
        public let dbClusterParameterGroupName: String?
        /// Specifies whether this cluster can be deleted. If DeletionProtection is enabled, the cluster cannot be deleted unless it is modified and DeletionProtection is disabled. DeletionProtection protects clusters from being accidentally deleted.
        public let deletionProtection: Bool?
        /// The version number of the database engine to which you want to upgrade. Modifying engine version is not supported on Amazon DocumentDB.
        public let engineVersion: String?
        /// The password for the master database user. This password can contain any printable ASCII character except forward slash (/), double quote ("), or the "at" symbol (@). Constraints: Must contain from 8 to 100 characters.
        public let masterUserPassword: String?
        /// The new cluster identifier for the cluster when renaming a cluster. This value is stored as a lowercase string. Constraints:   Must contain from 1 to 63 letters, numbers, or hyphens.   The first character must be a letter.   Cannot end with a hyphen or contain two consecutive hyphens.   Example: my-cluster2
        public let newDBClusterIdentifier: String?
        /// The port number on which the cluster accepts connections. Constraints: Must be a value from 1150 to 65535.  Default: The same port as the original cluster.
        public let port: Int?
        /// The daily time range during which automated backups are created if automated backups are enabled, using the BackupRetentionPeriod parameter.  The default is a 30-minute window selected at random from an 8-hour block of time for each Amazon Web Services Region.  Constraints:   Must be in the format hh24:mi-hh24:mi.   Must be in Universal Coordinated Time (UTC).   Must not conflict with the preferred maintenance window.   Must be at least 30 minutes.
        public let preferredBackupWindow: String?
        /// The weekly time range during which system maintenance can occur, in Universal Coordinated Time (UTC). Format: ddd:hh24:mi-ddd:hh24:mi  The default is a 30-minute window selected at random from an 8-hour block of time for each Amazon Web Services Region, occurring on a random day of the week.  Valid days: Mon, Tue, Wed, Thu, Fri, Sat, Sun Constraints: Minimum 30-minute window.
        public let preferredMaintenanceWindow: String?
        /// A list of virtual private cloud (VPC) security groups that the cluster will belong to.
        @OptionalCustomCoding<ArrayCoder<_VpcSecurityGroupIdsEncoding, String>>
        public var vpcSecurityGroupIds: [String]?

        public init(applyImmediately: Bool? = nil, backupRetentionPeriod: Int? = nil, cloudwatchLogsExportConfiguration: CloudwatchLogsExportConfiguration? = nil, dbClusterIdentifier: String, dbClusterParameterGroupName: String? = nil, deletionProtection: Bool? = nil, engineVersion: String? = nil, masterUserPassword: String? = nil, newDBClusterIdentifier: String? = nil, port: Int? = nil, preferredBackupWindow: String? = nil, preferredMaintenanceWindow: String? = nil, vpcSecurityGroupIds: [String]? = nil) {
            self.applyImmediately = applyImmediately
            self.backupRetentionPeriod = backupRetentionPeriod
            self.cloudwatchLogsExportConfiguration = cloudwatchLogsExportConfiguration
            self.dbClusterIdentifier = dbClusterIdentifier
            self.dbClusterParameterGroupName = dbClusterParameterGroupName
            self.deletionProtection = deletionProtection
            self.engineVersion = engineVersion
            self.masterUserPassword = masterUserPassword
            self.newDBClusterIdentifier = newDBClusterIdentifier
            self.port = port
            self.preferredBackupWindow = preferredBackupWindow
            self.preferredMaintenanceWindow = preferredMaintenanceWindow
            self.vpcSecurityGroupIds = vpcSecurityGroupIds
        }

        private enum CodingKeys: String, CodingKey {
            case applyImmediately = "ApplyImmediately"
            case backupRetentionPeriod = "BackupRetentionPeriod"
            case cloudwatchLogsExportConfiguration = "CloudwatchLogsExportConfiguration"
            case dbClusterIdentifier = "DBClusterIdentifier"
            case dbClusterParameterGroupName = "DBClusterParameterGroupName"
            case deletionProtection = "DeletionProtection"
            case engineVersion = "EngineVersion"
            case masterUserPassword = "MasterUserPassword"
            case newDBClusterIdentifier = "NewDBClusterIdentifier"
            case port = "Port"
            case preferredBackupWindow = "PreferredBackupWindow"
            case preferredMaintenanceWindow = "PreferredMaintenanceWindow"
            case vpcSecurityGroupIds = "VpcSecurityGroupIds"
        }
    }

    public struct ModifyDBClusterParameterGroupMessage: AWSEncodableShape {
        public struct _ParametersEncoding: ArrayCoderProperties { public static let member = "Parameter" }

        /// The name of the cluster parameter group to modify.
        public let dbClusterParameterGroupName: String
        /// A list of parameters in the cluster parameter group to modify.
        @CustomCoding<ArrayCoder<_ParametersEncoding, Parameter>>
        public var parameters: [Parameter]

        public init(dbClusterParameterGroupName: String, parameters: [Parameter]) {
            self.dbClusterParameterGroupName = dbClusterParameterGroupName
            self.parameters = parameters
        }

        private enum CodingKeys: String, CodingKey {
            case dbClusterParameterGroupName = "DBClusterParameterGroupName"
            case parameters = "Parameters"
        }
    }

    public struct ModifyDBClusterResult: AWSDecodableShape {
        public let dbCluster: DBCluster?

        public init(dbCluster: DBCluster? = nil) {
            self.dbCluster = dbCluster
        }

        private enum CodingKeys: String, CodingKey {
            case dbCluster = "DBCluster"
        }
    }

    public struct ModifyDBClusterSnapshotAttributeMessage: AWSEncodableShape {
        public struct _ValuesToAddEncoding: ArrayCoderProperties { public static let member = "AttributeValue" }
        public struct _ValuesToRemoveEncoding: ArrayCoderProperties { public static let member = "AttributeValue" }

        /// The name of the cluster snapshot attribute to modify. To manage authorization for other Amazon Web Services accounts to copy or restore a manual cluster snapshot, set this value to restore.
        public let attributeName: String
        /// The identifier for the cluster snapshot to modify the attributes for.
        public let dbClusterSnapshotIdentifier: String
        /// A list of cluster snapshot attributes to add to the attribute specified by AttributeName. To authorize other Amazon Web Services accounts to copy or restore a manual cluster snapshot, set this list to include one or more Amazon Web Services account IDs. To make the manual cluster snapshot restorable by any Amazon Web Services account, set it to all. Do not add the all value for any manual cluster snapshots that contain private information that you don't want to be available to all Amazon Web Services accounts.
        @OptionalCustomCoding<ArrayCoder<_ValuesToAddEncoding, String>>
        public var valuesToAdd: [String]?
        /// A list of cluster snapshot attributes to remove from the attribute specified by AttributeName. To remove authorization for other Amazon Web Services accounts to copy or restore a manual cluster snapshot, set this list to include one or more Amazon Web Services account identifiers. To remove authorization for any Amazon Web Services account to copy or restore the cluster snapshot, set it to all . If you specify all, an Amazon Web Services account whose account ID is explicitly added to the restore attribute can still copy or restore a manual cluster snapshot.
        @OptionalCustomCoding<ArrayCoder<_ValuesToRemoveEncoding, String>>
        public var valuesToRemove: [String]?

        public init(attributeName: String, dbClusterSnapshotIdentifier: String, valuesToAdd: [String]? = nil, valuesToRemove: [String]? = nil) {
            self.attributeName = attributeName
            self.dbClusterSnapshotIdentifier = dbClusterSnapshotIdentifier
            self.valuesToAdd = valuesToAdd
            self.valuesToRemove = valuesToRemove
        }

        private enum CodingKeys: String, CodingKey {
            case attributeName = "AttributeName"
            case dbClusterSnapshotIdentifier = "DBClusterSnapshotIdentifier"
            case valuesToAdd = "ValuesToAdd"
            case valuesToRemove = "ValuesToRemove"
        }
    }

    public struct ModifyDBClusterSnapshotAttributeResult: AWSDecodableShape {
        public let dbClusterSnapshotAttributesResult: DBClusterSnapshotAttributesResult?

        public init(dbClusterSnapshotAttributesResult: DBClusterSnapshotAttributesResult? = nil) {
            self.dbClusterSnapshotAttributesResult = dbClusterSnapshotAttributesResult
        }

        private enum CodingKeys: String, CodingKey {
            case dbClusterSnapshotAttributesResult = "DBClusterSnapshotAttributesResult"
        }
    }

    public struct ModifyDBInstanceMessage: AWSEncodableShape {
        /// Specifies whether the modifications in this request and any pending modifications are asynchronously applied as soon as possible, regardless of the PreferredMaintenanceWindow setting for the instance.  If this parameter is set to false, changes to the instance are applied during the next maintenance window. Some parameter changes can cause an outage and are applied on the next reboot. Default: false
        public let applyImmediately: Bool?
        /// This parameter does not apply to Amazon DocumentDB. Amazon DocumentDB does not perform minor version upgrades regardless of the value set.
        public let autoMinorVersionUpgrade: Bool?
        /// Indicates the certificate that needs to be associated with the instance.
        public let caCertificateIdentifier: String?
        /// A value that indicates whether to copy all tags from the DB instance to snapshots of the DB instance. By default, tags are not copied.
        public let copyTagsToSnapshot: Bool?
        /// The new compute and memory capacity of the instance; for example, db.r5.large. Not all instance classes are available in all Amazon Web Services Regions.  If you modify the instance class, an outage occurs during the change. The change is applied during the next maintenance window, unless ApplyImmediately is specified as true for this request.  Default: Uses existing setting.
        public let dbInstanceClass: String?
        /// The instance identifier. This value is stored as a lowercase string. Constraints:   Must match the identifier of an existing DBInstance.
        public let dbInstanceIdentifier: String
        /// A value that indicates whether to enable Performance Insights for the DB Instance. For more information, see Using Amazon Performance Insights.
        public let enablePerformanceInsights: Bool?
        ///  The new instance identifier for the instance when renaming an instance. When you change the instance identifier, an instance reboot occurs immediately if you set Apply Immediately to true. It occurs during the next maintenance window if you set Apply Immediately to false. This value is stored as a lowercase string.  Constraints:   Must contain from 1 to 63 letters, numbers, or hyphens.   The first character must be a letter.   Cannot end with a hyphen or contain two consecutive hyphens.   Example: mydbinstance
        public let newDBInstanceIdentifier: String?
        /// The KMS key identifier for encryption of Performance Insights data. The KMS key identifier is the key ARN, key ID, alias ARN, or alias name for the KMS key. If you do not specify a value for PerformanceInsightsKMSKeyId, then Amazon DocumentDB uses your default KMS key. There is a default KMS key for your Amazon Web Services account. Your Amazon Web Services account has a different default KMS key for each Amazon Web Services region.
        public let performanceInsightsKMSKeyId: String?
        /// The weekly time range (in UTC) during which system maintenance can occur, which might result in an outage. Changing this parameter doesn't result in an outage except in the following situation, and the change is asynchronously applied as soon as possible. If there are pending actions that cause a reboot, and the maintenance window is changed to include the current time, changing this parameter causes a reboot of the instance. If you are moving this window to the current time, there must be at least 30 minutes between the current time and end of the window to ensure that pending changes are applied. Default: Uses existing setting. Format: ddd:hh24:mi-ddd:hh24:mi  Valid days: Mon, Tue, Wed, Thu, Fri, Sat, Sun Constraints: Must be at least 30 minutes.
        public let preferredMaintenanceWindow: String?
        /// A value that specifies the order in which an Amazon DocumentDB replica is promoted to the primary instance after a failure of the existing primary instance. Default: 1 Valid values: 0-15
        public let promotionTier: Int?

        public init(applyImmediately: Bool? = nil, autoMinorVersionUpgrade: Bool? = nil, caCertificateIdentifier: String? = nil, copyTagsToSnapshot: Bool? = nil, dbInstanceClass: String? = nil, dbInstanceIdentifier: String, enablePerformanceInsights: Bool? = nil, newDBInstanceIdentifier: String? = nil, performanceInsightsKMSKeyId: String? = nil, preferredMaintenanceWindow: String? = nil, promotionTier: Int? = nil) {
            self.applyImmediately = applyImmediately
            self.autoMinorVersionUpgrade = autoMinorVersionUpgrade
            self.caCertificateIdentifier = caCertificateIdentifier
            self.copyTagsToSnapshot = copyTagsToSnapshot
            self.dbInstanceClass = dbInstanceClass
            self.dbInstanceIdentifier = dbInstanceIdentifier
            self.enablePerformanceInsights = enablePerformanceInsights
            self.newDBInstanceIdentifier = newDBInstanceIdentifier
            self.performanceInsightsKMSKeyId = performanceInsightsKMSKeyId
            self.preferredMaintenanceWindow = preferredMaintenanceWindow
            self.promotionTier = promotionTier
        }

        private enum CodingKeys: String, CodingKey {
            case applyImmediately = "ApplyImmediately"
            case autoMinorVersionUpgrade = "AutoMinorVersionUpgrade"
            case caCertificateIdentifier = "CACertificateIdentifier"
            case copyTagsToSnapshot = "CopyTagsToSnapshot"
            case dbInstanceClass = "DBInstanceClass"
            case dbInstanceIdentifier = "DBInstanceIdentifier"
            case enablePerformanceInsights = "EnablePerformanceInsights"
            case newDBInstanceIdentifier = "NewDBInstanceIdentifier"
            case performanceInsightsKMSKeyId = "PerformanceInsightsKMSKeyId"
            case preferredMaintenanceWindow = "PreferredMaintenanceWindow"
            case promotionTier = "PromotionTier"
        }
    }

    public struct ModifyDBInstanceResult: AWSDecodableShape {
        public let dbInstance: DBInstance?

        public init(dbInstance: DBInstance? = nil) {
            self.dbInstance = dbInstance
        }

        private enum CodingKeys: String, CodingKey {
            case dbInstance = "DBInstance"
        }
    }

    public struct ModifyDBSubnetGroupMessage: AWSEncodableShape {
        public struct _SubnetIdsEncoding: ArrayCoderProperties { public static let member = "SubnetIdentifier" }

        /// The description for the subnet group.
        public let dbSubnetGroupDescription: String?
        /// The name for the subnet group. This value is stored as a lowercase string. You can't modify the default subnet group.  Constraints: Must match the name of an existing DBSubnetGroup. Must not be default. Example: mySubnetgroup
        public let dbSubnetGroupName: String
        /// The Amazon EC2 subnet IDs for the subnet group.
        @CustomCoding<ArrayCoder<_SubnetIdsEncoding, String>>
        public var subnetIds: [String]

        public init(dbSubnetGroupDescription: String? = nil, dbSubnetGroupName: String, subnetIds: [String]) {
            self.dbSubnetGroupDescription = dbSubnetGroupDescription
            self.dbSubnetGroupName = dbSubnetGroupName
            self.subnetIds = subnetIds
        }

        private enum CodingKeys: String, CodingKey {
            case dbSubnetGroupDescription = "DBSubnetGroupDescription"
            case dbSubnetGroupName = "DBSubnetGroupName"
            case subnetIds = "SubnetIds"
        }
    }

    public struct ModifyDBSubnetGroupResult: AWSDecodableShape {
        public let dbSubnetGroup: DBSubnetGroup?

        public init(dbSubnetGroup: DBSubnetGroup? = nil) {
            self.dbSubnetGroup = dbSubnetGroup
        }

        private enum CodingKeys: String, CodingKey {
            case dbSubnetGroup = "DBSubnetGroup"
        }
    }

    public struct ModifyEventSubscriptionMessage: AWSEncodableShape {
        public struct _EventCategoriesEncoding: ArrayCoderProperties { public static let member = "EventCategory" }

        ///  A Boolean value; set to true to activate the subscription.
        public let enabled: Bool?
        ///  A list of event categories for a SourceType that you want to subscribe to.
        @OptionalCustomCoding<ArrayCoder<_EventCategoriesEncoding, String>>
        public var eventCategories: [String]?
        /// The Amazon Resource Name (ARN) of the SNS topic created for event notification. The ARN is created by Amazon SNS when you create a topic and subscribe to it.
        public let snsTopicArn: String?
        /// The type of source that is generating the events. For example, if you want to be notified of events generated by an instance, set this parameter to db-instance. If this value is not specified, all events are returned. Valid values: db-instance, db-parameter-group, db-security-group
        public let sourceType: String?
        /// The name of the Amazon DocumentDB event notification subscription.
        public let subscriptionName: String

        public init(enabled: Bool? = nil, eventCategories: [String]? = nil, snsTopicArn: String? = nil, sourceType: String? = nil, subscriptionName: String) {
            self.enabled = enabled
            self.eventCategories = eventCategories
            self.snsTopicArn = snsTopicArn
            self.sourceType = sourceType
            self.subscriptionName = subscriptionName
        }

        private enum CodingKeys: String, CodingKey {
            case enabled = "Enabled"
            case eventCategories = "EventCategories"
            case snsTopicArn = "SnsTopicArn"
            case sourceType = "SourceType"
            case subscriptionName = "SubscriptionName"
        }
    }

    public struct ModifyEventSubscriptionResult: AWSDecodableShape {
        public let eventSubscription: EventSubscription?

        public init(eventSubscription: EventSubscription? = nil) {
            self.eventSubscription = eventSubscription
        }

        private enum CodingKeys: String, CodingKey {
            case eventSubscription = "EventSubscription"
        }
    }

    public struct ModifyGlobalClusterMessage: AWSEncodableShape {
        /// Indicates if the global cluster has deletion protection enabled. The global cluster can't be deleted when deletion protection is enabled.
        public let deletionProtection: Bool?
        /// The identifier for the global cluster being modified. This parameter isn't case-sensitive.
        /// 		       Constraints:
        /// 				           Must match the identifier of an existing global cluster.
        ///
        public let globalClusterIdentifier: String
        /// The new identifier for a global cluster when you modify a global cluster. This value is stored as a lowercase string.
        /// 				           Must contain from 1 to 63 letters, numbers, or hyphens
        /// 				           The first character must be a letter
        /// 				           Can't end with a hyphen or contain two consecutive hyphens
        ///
        /// 		       Example: my-cluster2
        public let newGlobalClusterIdentifier: String?

        public init(deletionProtection: Bool? = nil, globalClusterIdentifier: String, newGlobalClusterIdentifier: String? = nil) {
            self.deletionProtection = deletionProtection
            self.globalClusterIdentifier = globalClusterIdentifier
            self.newGlobalClusterIdentifier = newGlobalClusterIdentifier
        }

        public func validate(name: String) throws {
            try self.validate(self.globalClusterIdentifier, name: "globalClusterIdentifier", parent: name, max: 255)
            try self.validate(self.globalClusterIdentifier, name: "globalClusterIdentifier", parent: name, min: 1)
            try self.validate(self.globalClusterIdentifier, name: "globalClusterIdentifier", parent: name, pattern: "^[A-Za-z][0-9A-Za-z-:._]*$")
            try self.validate(self.newGlobalClusterIdentifier, name: "newGlobalClusterIdentifier", parent: name, max: 255)
            try self.validate(self.newGlobalClusterIdentifier, name: "newGlobalClusterIdentifier", parent: name, min: 1)
            try self.validate(self.newGlobalClusterIdentifier, name: "newGlobalClusterIdentifier", parent: name, pattern: "^[A-Za-z][0-9A-Za-z-:._]*$")
        }

        private enum CodingKeys: String, CodingKey {
            case deletionProtection = "DeletionProtection"
            case globalClusterIdentifier = "GlobalClusterIdentifier"
            case newGlobalClusterIdentifier = "NewGlobalClusterIdentifier"
        }
    }

    public struct ModifyGlobalClusterResult: AWSDecodableShape {
        public let globalCluster: GlobalCluster?

        public init(globalCluster: GlobalCluster? = nil) {
            self.globalCluster = globalCluster
        }

        private enum CodingKeys: String, CodingKey {
            case globalCluster = "GlobalCluster"
        }
    }

    public struct OrderableDBInstanceOption: AWSDecodableShape {
        public struct _AvailabilityZonesEncoding: ArrayCoderProperties { public static let member = "AvailabilityZone" }

        /// A list of Availability Zones for an instance.
        @OptionalCustomCoding<ArrayCoder<_AvailabilityZonesEncoding, AvailabilityZone>>
        public var availabilityZones: [AvailabilityZone]?
        /// The instance class for an instance.
        public let dbInstanceClass: String?
        /// The engine type of an instance.
        public let engine: String?
        /// The engine version of an instance.
        public let engineVersion: String?
        /// The license model for an instance.
        public let licenseModel: String?
        /// Indicates whether an instance is in a virtual private cloud (VPC).
        public let vpc: Bool?

        public init(availabilityZones: [AvailabilityZone]? = nil, dbInstanceClass: String? = nil, engine: String? = nil, engineVersion: String? = nil, licenseModel: String? = nil, vpc: Bool? = nil) {
            self.availabilityZones = availabilityZones
            self.dbInstanceClass = dbInstanceClass
            self.engine = engine
            self.engineVersion = engineVersion
            self.licenseModel = licenseModel
            self.vpc = vpc
        }

        private enum CodingKeys: String, CodingKey {
            case availabilityZones = "AvailabilityZones"
            case dbInstanceClass = "DBInstanceClass"
            case engine = "Engine"
            case engineVersion = "EngineVersion"
            case licenseModel = "LicenseModel"
            case vpc = "Vpc"
        }
    }

    public struct OrderableDBInstanceOptionsMessage: AWSDecodableShape {
        public struct _OrderableDBInstanceOptionsEncoding: ArrayCoderProperties { public static let member = "OrderableDBInstanceOption" }

        /// An optional pagination token provided by a previous request. If this parameter is specified, the response includes only records beyond the marker, up to the value specified by MaxRecords.
        public let marker: String?
        /// The options that are available for a particular orderable instance.
        @OptionalCustomCoding<ArrayCoder<_OrderableDBInstanceOptionsEncoding, OrderableDBInstanceOption>>
        public var orderableDBInstanceOptions: [OrderableDBInstanceOption]?

        public init(marker: String? = nil, orderableDBInstanceOptions: [OrderableDBInstanceOption]? = nil) {
            self.marker = marker
            self.orderableDBInstanceOptions = orderableDBInstanceOptions
        }

        private enum CodingKeys: String, CodingKey {
            case marker = "Marker"
            case orderableDBInstanceOptions = "OrderableDBInstanceOptions"
        }
    }

    public struct Parameter: AWSEncodableShape & AWSDecodableShape {
        /// Specifies the valid range of values for the parameter.
        public let allowedValues: String?
        /// Indicates when to apply parameter updates.
        public let applyMethod: ApplyMethod?
        /// Specifies the engine-specific parameters type.
        public let applyType: String?
        /// Specifies the valid data type for the parameter.
        public let dataType: String?
        /// Provides a description of the parameter.
        public let description: String?
        ///  Indicates whether (true) or not (false) the parameter can be modified. Some parameters have security or operational implications that prevent them from being changed.
        public let isModifiable: Bool?
        /// The earliest engine version to which the parameter can apply.
        public let minimumEngineVersion: String?
        /// Specifies the name of the parameter.
        public let parameterName: String?
        /// Specifies the value of the parameter.
        public let parameterValue: String?
        /// Indicates the source of the parameter value.
        public let source: String?

        public init(allowedValues: String? = nil, applyMethod: ApplyMethod? = nil, applyType: String? = nil, dataType: String? = nil, description: String? = nil, isModifiable: Bool? = nil, minimumEngineVersion: String? = nil, parameterName: String? = nil, parameterValue: String? = nil, source: String? = nil) {
            self.allowedValues = allowedValues
            self.applyMethod = applyMethod
            self.applyType = applyType
            self.dataType = dataType
            self.description = description
            self.isModifiable = isModifiable
            self.minimumEngineVersion = minimumEngineVersion
            self.parameterName = parameterName
            self.parameterValue = parameterValue
            self.source = source
        }

        private enum CodingKeys: String, CodingKey {
            case allowedValues = "AllowedValues"
            case applyMethod = "ApplyMethod"
            case applyType = "ApplyType"
            case dataType = "DataType"
            case description = "Description"
            case isModifiable = "IsModifiable"
            case minimumEngineVersion = "MinimumEngineVersion"
            case parameterName = "ParameterName"
            case parameterValue = "ParameterValue"
            case source = "Source"
        }
    }

    public struct PendingCloudwatchLogsExports: AWSDecodableShape {
        /// Log types that are in the process of being enabled. After they are enabled, these log types are exported to Amazon CloudWatch Logs.
        @OptionalCustomCoding<StandardArrayCoder>
        public var logTypesToDisable: [String]?
        /// Log types that are in the process of being deactivated. After they are deactivated, these log types aren't exported to CloudWatch Logs.
        @OptionalCustomCoding<StandardArrayCoder>
        public var logTypesToEnable: [String]?

        public init(logTypesToDisable: [String]? = nil, logTypesToEnable: [String]? = nil) {
            self.logTypesToDisable = logTypesToDisable
            self.logTypesToEnable = logTypesToEnable
        }

        private enum CodingKeys: String, CodingKey {
            case logTypesToDisable = "LogTypesToDisable"
            case logTypesToEnable = "LogTypesToEnable"
        }
    }

    public struct PendingMaintenanceAction: AWSDecodableShape {
        /// The type of pending maintenance action that is available for the resource.
        public let action: String?
        /// The date of the maintenance window when the action is applied. The maintenance action is applied to the resource during its first maintenance window after this date. If this date is specified, any next-maintenance opt-in requests are ignored.
        public let autoAppliedAfterDate: Date?
        /// The effective date when the pending maintenance action is applied to the resource.
        public let currentApplyDate: Date?
        /// A description providing more detail about the maintenance action.
        public let description: String?
        /// The date when the maintenance action is automatically applied. The maintenance action is applied to the resource on this date regardless of the maintenance window for the resource. If this date is specified, any immediate opt-in requests are ignored.
        public let forcedApplyDate: Date?
        /// Indicates the type of opt-in request that has been received for the resource.
        public let optInStatus: String?

        public init(action: String? = nil, autoAppliedAfterDate: Date? = nil, currentApplyDate: Date? = nil, description: String? = nil, forcedApplyDate: Date? = nil, optInStatus: String? = nil) {
            self.action = action
            self.autoAppliedAfterDate = autoAppliedAfterDate
            self.currentApplyDate = currentApplyDate
            self.description = description
            self.forcedApplyDate = forcedApplyDate
            self.optInStatus = optInStatus
        }

        private enum CodingKeys: String, CodingKey {
            case action = "Action"
            case autoAppliedAfterDate = "AutoAppliedAfterDate"
            case currentApplyDate = "CurrentApplyDate"
            case description = "Description"
            case forcedApplyDate = "ForcedApplyDate"
            case optInStatus = "OptInStatus"
        }
    }

    public struct PendingMaintenanceActionsMessage: AWSDecodableShape {
        public struct _PendingMaintenanceActionsEncoding: ArrayCoderProperties { public static let member = "ResourcePendingMaintenanceActions" }

        /// An optional pagination token provided by a previous request. If this parameter is specified, the response includes only records beyond the marker, up to the value specified by MaxRecords.
        public let marker: String?
        /// The maintenance actions to be applied.
        @OptionalCustomCoding<ArrayCoder<_PendingMaintenanceActionsEncoding, ResourcePendingMaintenanceActions>>
        public var pendingMaintenanceActions: [ResourcePendingMaintenanceActions]?

        public init(marker: String? = nil, pendingMaintenanceActions: [ResourcePendingMaintenanceActions]? = nil) {
            self.marker = marker
            self.pendingMaintenanceActions = pendingMaintenanceActions
        }

        private enum CodingKeys: String, CodingKey {
            case marker = "Marker"
            case pendingMaintenanceActions = "PendingMaintenanceActions"
        }
    }

    public struct PendingModifiedValues: AWSDecodableShape {
        ///  Contains the new AllocatedStorage size for then instance that will be applied or is currently being applied.
        public let allocatedStorage: Int?
        /// Specifies the pending number of days for which automated backups are retained.
        public let backupRetentionPeriod: Int?
        /// Specifies the identifier of the certificate authority (CA) certificate for the DB instance.
        public let caCertificateIdentifier: String?
        ///  Contains the new DBInstanceClass for the instance that will be applied or is currently being applied.
        public let dbInstanceClass: String?
        ///  Contains the new DBInstanceIdentifier for the instance that will be applied or is currently being applied.
        public let dbInstanceIdentifier: String?
        /// The new subnet group for the instance.
        public let dbSubnetGroupName: String?
        /// Indicates the database engine version.
        public let engineVersion: String?
        /// Specifies the new Provisioned IOPS value for the instance that will be applied or is currently being applied.
        public let iops: Int?
        /// The license model for the instance. Valid values: license-included, bring-your-own-license, general-public-license
        public let licenseModel: String?
        /// Contains the pending or currently in-progress change of the master credentials for the instance.
        public let masterUserPassword: String?
        /// Indicates that the Single-AZ instance is to change to a Multi-AZ deployment.
        public let multiAZ: Bool?
        /// A list of the log types whose configuration is still pending. These log types are in the process of being activated or deactivated.
        public let pendingCloudwatchLogsExports: PendingCloudwatchLogsExports?
        /// Specifies the pending port for the instance.
        public let port: Int?
        /// Specifies the storage type to be associated with the instance.
        public let storageType: String?

        public init(allocatedStorage: Int? = nil, backupRetentionPeriod: Int? = nil, caCertificateIdentifier: String? = nil, dbInstanceClass: String? = nil, dbInstanceIdentifier: String? = nil, dbSubnetGroupName: String? = nil, engineVersion: String? = nil, iops: Int? = nil, licenseModel: String? = nil, masterUserPassword: String? = nil, multiAZ: Bool? = nil, pendingCloudwatchLogsExports: PendingCloudwatchLogsExports? = nil, port: Int? = nil, storageType: String? = nil) {
            self.allocatedStorage = allocatedStorage
            self.backupRetentionPeriod = backupRetentionPeriod
            self.caCertificateIdentifier = caCertificateIdentifier
            self.dbInstanceClass = dbInstanceClass
            self.dbInstanceIdentifier = dbInstanceIdentifier
            self.dbSubnetGroupName = dbSubnetGroupName
            self.engineVersion = engineVersion
            self.iops = iops
            self.licenseModel = licenseModel
            self.masterUserPassword = masterUserPassword
            self.multiAZ = multiAZ
            self.pendingCloudwatchLogsExports = pendingCloudwatchLogsExports
            self.port = port
            self.storageType = storageType
        }

        private enum CodingKeys: String, CodingKey {
            case allocatedStorage = "AllocatedStorage"
            case backupRetentionPeriod = "BackupRetentionPeriod"
            case caCertificateIdentifier = "CACertificateIdentifier"
            case dbInstanceClass = "DBInstanceClass"
            case dbInstanceIdentifier = "DBInstanceIdentifier"
            case dbSubnetGroupName = "DBSubnetGroupName"
            case engineVersion = "EngineVersion"
            case iops = "Iops"
            case licenseModel = "LicenseModel"
            case masterUserPassword = "MasterUserPassword"
            case multiAZ = "MultiAZ"
            case pendingCloudwatchLogsExports = "PendingCloudwatchLogsExports"
            case port = "Port"
            case storageType = "StorageType"
        }
    }

    public struct RebootDBInstanceMessage: AWSEncodableShape {
        /// The instance identifier. This parameter is stored as a lowercase string. Constraints:   Must match the identifier of an existing DBInstance.
        public let dbInstanceIdentifier: String
        ///  When true, the reboot is conducted through a Multi-AZ failover.  Constraint: You can't specify true if the instance is not configured for Multi-AZ.
        public let forceFailover: Bool?

        public init(dbInstanceIdentifier: String, forceFailover: Bool? = nil) {
            self.dbInstanceIdentifier = dbInstanceIdentifier
            self.forceFailover = forceFailover
        }

        private enum CodingKeys: String, CodingKey {
            case dbInstanceIdentifier = "DBInstanceIdentifier"
            case forceFailover = "ForceFailover"
        }
    }

    public struct RebootDBInstanceResult: AWSDecodableShape {
        public let dbInstance: DBInstance?

        public init(dbInstance: DBInstance? = nil) {
            self.dbInstance = dbInstance
        }

        private enum CodingKeys: String, CodingKey {
            case dbInstance = "DBInstance"
        }
    }

    public struct RemoveFromGlobalClusterMessage: AWSEncodableShape {
        /// The Amazon Resource Name (ARN) identifying the cluster that was detached from the Amazon DocumentDB global cluster.
        public let dbClusterIdentifier: String
        /// The cluster identifier to detach from the Amazon DocumentDB global cluster.
        public let globalClusterIdentifier: String

        public init(dbClusterIdentifier: String, globalClusterIdentifier: String) {
            self.dbClusterIdentifier = dbClusterIdentifier
            self.globalClusterIdentifier = globalClusterIdentifier
        }

        public func validate(name: String) throws {
            try self.validate(self.globalClusterIdentifier, name: "globalClusterIdentifier", parent: name, max: 255)
            try self.validate(self.globalClusterIdentifier, name: "globalClusterIdentifier", parent: name, min: 1)
            try self.validate(self.globalClusterIdentifier, name: "globalClusterIdentifier", parent: name, pattern: "^[A-Za-z][0-9A-Za-z-:._]*$")
        }

        private enum CodingKeys: String, CodingKey {
            case dbClusterIdentifier = "DbClusterIdentifier"
            case globalClusterIdentifier = "GlobalClusterIdentifier"
        }
    }

    public struct RemoveFromGlobalClusterResult: AWSDecodableShape {
        public let globalCluster: GlobalCluster?

        public init(globalCluster: GlobalCluster? = nil) {
            self.globalCluster = globalCluster
        }

        private enum CodingKeys: String, CodingKey {
            case globalCluster = "GlobalCluster"
        }
    }

    public struct RemoveSourceIdentifierFromSubscriptionMessage: AWSEncodableShape {
        ///  The source identifier to be removed from the subscription, such as the instance identifier for an instance, or the name of a security group.
        public let sourceIdentifier: String
        /// The name of the Amazon DocumentDB event notification subscription that you want to remove a source identifier from.
        public let subscriptionName: String

        public init(sourceIdentifier: String, subscriptionName: String) {
            self.sourceIdentifier = sourceIdentifier
            self.subscriptionName = subscriptionName
        }

        private enum CodingKeys: String, CodingKey {
            case sourceIdentifier = "SourceIdentifier"
            case subscriptionName = "SubscriptionName"
        }
    }

    public struct RemoveSourceIdentifierFromSubscriptionResult: AWSDecodableShape {
        public let eventSubscription: EventSubscription?

        public init(eventSubscription: EventSubscription? = nil) {
            self.eventSubscription = eventSubscription
        }

        private enum CodingKeys: String, CodingKey {
            case eventSubscription = "EventSubscription"
        }
    }

    public struct RemoveTagsFromResourceMessage: AWSEncodableShape {
        /// The Amazon DocumentDB resource that the tags are removed from. This value is an Amazon Resource Name (ARN).
        public let resourceName: String
        /// The tag key (name) of the tag to be removed.
        @CustomCoding<StandardArrayCoder>
        public var tagKeys: [String]

        public init(resourceName: String, tagKeys: [String]) {
            self.resourceName = resourceName
            self.tagKeys = tagKeys
        }

        private enum CodingKeys: String, CodingKey {
            case resourceName = "ResourceName"
            case tagKeys = "TagKeys"
        }
    }

    public struct ResetDBClusterParameterGroupMessage: AWSEncodableShape {
        public struct _ParametersEncoding: ArrayCoderProperties { public static let member = "Parameter" }

        /// The name of the cluster parameter group to reset.
        public let dbClusterParameterGroupName: String
        /// A list of parameter names in the cluster parameter group to reset to the default values. You can't use this parameter if the ResetAllParameters parameter is set to true.
        @OptionalCustomCoding<ArrayCoder<_ParametersEncoding, Parameter>>
        public var parameters: [Parameter]?
        /// A value that is set to true to reset all parameters in the cluster parameter group to their default values, and false otherwise. You can't use this parameter if there is a list of parameter names specified for the Parameters parameter.
        public let resetAllParameters: Bool?

        public init(dbClusterParameterGroupName: String, parameters: [Parameter]? = nil, resetAllParameters: Bool? = nil) {
            self.dbClusterParameterGroupName = dbClusterParameterGroupName
            self.parameters = parameters
            self.resetAllParameters = resetAllParameters
        }

        private enum CodingKeys: String, CodingKey {
            case dbClusterParameterGroupName = "DBClusterParameterGroupName"
            case parameters = "Parameters"
            case resetAllParameters = "ResetAllParameters"
        }
    }

    public struct ResourcePendingMaintenanceActions: AWSDecodableShape {
        public struct _PendingMaintenanceActionDetailsEncoding: ArrayCoderProperties { public static let member = "PendingMaintenanceAction" }

        /// A list that provides details about the pending maintenance actions for the resource.
        @OptionalCustomCoding<ArrayCoder<_PendingMaintenanceActionDetailsEncoding, PendingMaintenanceAction>>
        public var pendingMaintenanceActionDetails: [PendingMaintenanceAction]?
        /// The Amazon Resource Name (ARN) of the resource that has pending  maintenance actions.
        public let resourceIdentifier: String?

        public init(pendingMaintenanceActionDetails: [PendingMaintenanceAction]? = nil, resourceIdentifier: String? = nil) {
            self.pendingMaintenanceActionDetails = pendingMaintenanceActionDetails
            self.resourceIdentifier = resourceIdentifier
        }

        private enum CodingKeys: String, CodingKey {
            case pendingMaintenanceActionDetails = "PendingMaintenanceActionDetails"
            case resourceIdentifier = "ResourceIdentifier"
        }
    }

    public struct RestoreDBClusterFromSnapshotMessage: AWSEncodableShape {
        public struct _AvailabilityZonesEncoding: ArrayCoderProperties { public static let member = "AvailabilityZone" }
        public struct _TagsEncoding: ArrayCoderProperties { public static let member = "Tag" }
        public struct _VpcSecurityGroupIdsEncoding: ArrayCoderProperties { public static let member = "VpcSecurityGroupId" }

        /// Provides the list of Amazon EC2 Availability Zones that instances in the restored DB cluster can be created in.
        @OptionalCustomCoding<ArrayCoder<_AvailabilityZonesEncoding, String>>
        public var availabilityZones: [String]?
        /// The name of the cluster to create from the snapshot or cluster snapshot. This parameter isn't case sensitive. Constraints:   Must contain from 1 to 63 letters, numbers, or hyphens.   The first character must be a letter.   Cannot end with a hyphen or contain two consecutive hyphens.   Example: my-snapshot-id
        public let dbClusterIdentifier: String
        /// The name of the subnet group to use for the new cluster. Constraints: If provided, must match the name of an existing DBSubnetGroup. Example: mySubnetgroup
        public let dbSubnetGroupName: String?
        /// Specifies whether this cluster can be deleted. If DeletionProtection is enabled, the cluster cannot be deleted unless it is modified and DeletionProtection is disabled. DeletionProtection protects clusters from being accidentally deleted.
        public let deletionProtection: Bool?
        /// A list of log types that must be enabled for exporting to Amazon CloudWatch Logs.
        @OptionalCustomCoding<StandardArrayCoder>
        public var enableCloudwatchLogsExports: [String]?
        /// The database engine to use for the new cluster. Default: The same as source. Constraint: Must be compatible with the engine of the source.
        public let engine: String
        /// The version of the database engine to use for the new cluster.
        public let engineVersion: String?
        /// The KMS key identifier to use when restoring an encrypted cluster from a DB snapshot or cluster snapshot. The KMS key identifier is the Amazon Resource Name (ARN) for the KMS encryption key. If you are restoring a cluster with the same Amazon Web Services account that owns the KMS encryption key used to encrypt the new cluster, then you can use the KMS key alias instead of the ARN for the KMS encryption key. If you do not specify a value for the KmsKeyId parameter, then the following occurs:   If the snapshot or cluster snapshot in SnapshotIdentifier is encrypted, then the restored cluster is encrypted using the KMS key that was used to encrypt the snapshot or the cluster snapshot.   If the snapshot or the cluster snapshot in SnapshotIdentifier is not encrypted, then the restored DB cluster is not encrypted.
        public let kmsKeyId: String?
        /// The port number on which the new cluster accepts connections. Constraints: Must be a value from 1150 to 65535. Default: The same port as the original cluster.
        public let port: Int?
        /// The identifier for the snapshot or cluster snapshot to restore from. You can use either the name or the Amazon Resource Name (ARN) to specify a cluster snapshot. However, you can use only the ARN to specify a snapshot. Constraints:   Must match the identifier of an existing snapshot.
        public let snapshotIdentifier: String
        /// The tags to be assigned to the restored cluster.
        @OptionalCustomCoding<ArrayCoder<_TagsEncoding, Tag>>
        public var tags: [Tag]?
        /// A list of virtual private cloud (VPC) security groups that the new cluster will belong to.
        @OptionalCustomCoding<ArrayCoder<_VpcSecurityGroupIdsEncoding, String>>
        public var vpcSecurityGroupIds: [String]?

        public init(availabilityZones: [String]? = nil, dbClusterIdentifier: String, dbSubnetGroupName: String? = nil, deletionProtection: Bool? = nil, enableCloudwatchLogsExports: [String]? = nil, engine: String, engineVersion: String? = nil, kmsKeyId: String? = nil, port: Int? = nil, snapshotIdentifier: String, tags: [Tag]? = nil, vpcSecurityGroupIds: [String]? = nil) {
            self.availabilityZones = availabilityZones
            self.dbClusterIdentifier = dbClusterIdentifier
            self.dbSubnetGroupName = dbSubnetGroupName
            self.deletionProtection = deletionProtection
            self.enableCloudwatchLogsExports = enableCloudwatchLogsExports
            self.engine = engine
            self.engineVersion = engineVersion
            self.kmsKeyId = kmsKeyId
            self.port = port
            self.snapshotIdentifier = snapshotIdentifier
            self.tags = tags
            self.vpcSecurityGroupIds = vpcSecurityGroupIds
        }

        private enum CodingKeys: String, CodingKey {
            case availabilityZones = "AvailabilityZones"
            case dbClusterIdentifier = "DBClusterIdentifier"
            case dbSubnetGroupName = "DBSubnetGroupName"
            case deletionProtection = "DeletionProtection"
            case enableCloudwatchLogsExports = "EnableCloudwatchLogsExports"
            case engine = "Engine"
            case engineVersion = "EngineVersion"
            case kmsKeyId = "KmsKeyId"
            case port = "Port"
            case snapshotIdentifier = "SnapshotIdentifier"
            case tags = "Tags"
            case vpcSecurityGroupIds = "VpcSecurityGroupIds"
        }
    }

    public struct RestoreDBClusterFromSnapshotResult: AWSDecodableShape {
        public let dbCluster: DBCluster?

        public init(dbCluster: DBCluster? = nil) {
            self.dbCluster = dbCluster
        }

        private enum CodingKeys: String, CodingKey {
            case dbCluster = "DBCluster"
        }
    }

    public struct RestoreDBClusterToPointInTimeMessage: AWSEncodableShape {
        public struct _TagsEncoding: ArrayCoderProperties { public static let member = "Tag" }
        public struct _VpcSecurityGroupIdsEncoding: ArrayCoderProperties { public static let member = "VpcSecurityGroupId" }

        /// The name of the new cluster to be created. Constraints:   Must contain from 1 to 63 letters, numbers, or hyphens.   The first character must be a letter.   Cannot end with a hyphen or contain two consecutive hyphens.
        public let dbClusterIdentifier: String
        /// The subnet group name to use for the new cluster. Constraints: If provided, must match the name of an existing DBSubnetGroup. Example: mySubnetgroup
        public let dbSubnetGroupName: String?
        /// Specifies whether this cluster can be deleted. If DeletionProtection is enabled, the cluster cannot be deleted unless it is modified and DeletionProtection is disabled. DeletionProtection protects clusters from being accidentally deleted.
        public let deletionProtection: Bool?
        /// A list of log types that must be enabled for exporting to Amazon CloudWatch Logs.
        @OptionalCustomCoding<StandardArrayCoder>
        public var enableCloudwatchLogsExports: [String]?
        /// The KMS key identifier to use when restoring an encrypted cluster from an encrypted cluster. The KMS key identifier is the Amazon Resource Name (ARN) for the KMS encryption key. If you are restoring a cluster with the same Amazon Web Services account that owns the KMS encryption key used to encrypt the new cluster, then you can use the KMS key alias instead of the ARN for the KMS encryption key. You can restore to a new cluster and encrypt the new cluster with an KMS key that is different from the KMS key used to encrypt the source cluster. The new DB cluster is encrypted with the KMS key identified by the KmsKeyId parameter. If you do not specify a value for the KmsKeyId parameter, then the following occurs:   If the cluster is encrypted, then the restored cluster is encrypted using the KMS key that was used to encrypt the source cluster.   If the cluster is not encrypted, then the restored cluster is not encrypted.   If DBClusterIdentifier refers to a cluster that is not encrypted, then the restore request is rejected.
        public let kmsKeyId: String?
        /// The port number on which the new cluster accepts connections. Constraints: Must be a value from 1150 to 65535.  Default: The default port for the engine.
        public let port: Int?
        /// The date and time to restore the cluster to. Valid values: A time in Universal Coordinated Time (UTC) format. Constraints:   Must be before the latest restorable time for the instance.   Must be specified if the UseLatestRestorableTime parameter is not provided.   Cannot be specified if the UseLatestRestorableTime parameter is true.   Cannot be specified if the RestoreType parameter is copy-on-write.   Example: 2015-03-07T23:45:00Z
        public let restoreToTime: Date?
        /// The type of restore to be performed. You can specify one of the following values:    full-copy - The new DB cluster is restored as a full copy of the source DB cluster.    copy-on-write - The new DB cluster is restored as a clone of the source DB cluster.   If you don't specify a RestoreType value, then the new DB cluster is restored as a full copy of the source DB cluster.
        public let restoreType: String?
        /// The identifier of the source cluster from which to restore. Constraints:   Must match the identifier of an existing DBCluster.
        public let sourceDBClusterIdentifier: String
        /// The tags to be assigned to the restored cluster.
        @OptionalCustomCoding<ArrayCoder<_TagsEncoding, Tag>>
        public var tags: [Tag]?
        /// A value that is set to true to restore the cluster to the latest restorable backup time, and false otherwise.  Default: false  Constraints: Cannot be specified if the RestoreToTime parameter is provided.
        public let useLatestRestorableTime: Bool?
        /// A list of VPC security groups that the new cluster belongs to.
        @OptionalCustomCoding<ArrayCoder<_VpcSecurityGroupIdsEncoding, String>>
        public var vpcSecurityGroupIds: [String]?

        public init(dbClusterIdentifier: String, dbSubnetGroupName: String? = nil, deletionProtection: Bool? = nil, enableCloudwatchLogsExports: [String]? = nil, kmsKeyId: String? = nil, port: Int? = nil, restoreToTime: Date? = nil, restoreType: String? = nil, sourceDBClusterIdentifier: String, tags: [Tag]? = nil, useLatestRestorableTime: Bool? = nil, vpcSecurityGroupIds: [String]? = nil) {
            self.dbClusterIdentifier = dbClusterIdentifier
            self.dbSubnetGroupName = dbSubnetGroupName
            self.deletionProtection = deletionProtection
            self.enableCloudwatchLogsExports = enableCloudwatchLogsExports
            self.kmsKeyId = kmsKeyId
            self.port = port
            self.restoreToTime = restoreToTime
            self.restoreType = restoreType
            self.sourceDBClusterIdentifier = sourceDBClusterIdentifier
            self.tags = tags
            self.useLatestRestorableTime = useLatestRestorableTime
            self.vpcSecurityGroupIds = vpcSecurityGroupIds
        }

        private enum CodingKeys: String, CodingKey {
            case dbClusterIdentifier = "DBClusterIdentifier"
            case dbSubnetGroupName = "DBSubnetGroupName"
            case deletionProtection = "DeletionProtection"
            case enableCloudwatchLogsExports = "EnableCloudwatchLogsExports"
            case kmsKeyId = "KmsKeyId"
            case port = "Port"
            case restoreToTime = "RestoreToTime"
            case restoreType = "RestoreType"
            case sourceDBClusterIdentifier = "SourceDBClusterIdentifier"
            case tags = "Tags"
            case useLatestRestorableTime = "UseLatestRestorableTime"
            case vpcSecurityGroupIds = "VpcSecurityGroupIds"
        }
    }

    public struct RestoreDBClusterToPointInTimeResult: AWSDecodableShape {
        public let dbCluster: DBCluster?

        public init(dbCluster: DBCluster? = nil) {
            self.dbCluster = dbCluster
        }

        private enum CodingKeys: String, CodingKey {
            case dbCluster = "DBCluster"
        }
    }

    public struct StartDBClusterMessage: AWSEncodableShape {
        /// The identifier of the cluster to restart. Example: docdb-2019-05-28-15-24-52
        public let dbClusterIdentifier: String

        public init(dbClusterIdentifier: String) {
            self.dbClusterIdentifier = dbClusterIdentifier
        }

        private enum CodingKeys: String, CodingKey {
            case dbClusterIdentifier = "DBClusterIdentifier"
        }
    }

    public struct StartDBClusterResult: AWSDecodableShape {
        public let dbCluster: DBCluster?

        public init(dbCluster: DBCluster? = nil) {
            self.dbCluster = dbCluster
        }

        private enum CodingKeys: String, CodingKey {
            case dbCluster = "DBCluster"
        }
    }

    public struct StopDBClusterMessage: AWSEncodableShape {
        /// The identifier of the cluster to stop. Example: docdb-2019-05-28-15-24-52
        public let dbClusterIdentifier: String

        public init(dbClusterIdentifier: String) {
            self.dbClusterIdentifier = dbClusterIdentifier
        }

        private enum CodingKeys: String, CodingKey {
            case dbClusterIdentifier = "DBClusterIdentifier"
        }
    }

    public struct StopDBClusterResult: AWSDecodableShape {
        public let dbCluster: DBCluster?

        public init(dbCluster: DBCluster? = nil) {
            self.dbCluster = dbCluster
        }

        private enum CodingKeys: String, CodingKey {
            case dbCluster = "DBCluster"
        }
    }

    public struct Subnet: AWSDecodableShape {
        /// Specifies the Availability Zone for the subnet.
        public let subnetAvailabilityZone: AvailabilityZone?
        /// Specifies the identifier of the subnet.
        public let subnetIdentifier: String?
        /// Specifies the status of the subnet.
        public let subnetStatus: String?

        public init(subnetAvailabilityZone: AvailabilityZone? = nil, subnetIdentifier: String? = nil, subnetStatus: String? = nil) {
            self.subnetAvailabilityZone = subnetAvailabilityZone
            self.subnetIdentifier = subnetIdentifier
            self.subnetStatus = subnetStatus
        }

        private enum CodingKeys: String, CodingKey {
            case subnetAvailabilityZone = "SubnetAvailabilityZone"
            case subnetIdentifier = "SubnetIdentifier"
            case subnetStatus = "SubnetStatus"
        }
    }

    public struct Tag: AWSEncodableShape & AWSDecodableShape {
        /// The required name of the tag. The string value can be from 1 to 128 Unicode characters in length and can't be prefixed with "aws:" or "rds:". The string can contain only the set of Unicode letters, digits, white space, '_', '.', '/', '=', '+', '-' (Java regex: "^([\\p{L}\\p{Z}\\p{N}_.:/=+\\-]*)$").
        public let key: String?
        /// The optional value of the tag. The string value can be from 1 to 256 Unicode characters in length and can't be prefixed with "aws:" or "rds:". The string can contain only the set of Unicode letters, digits, white space, '_', '.', '/', '=', '+', '-' (Java regex: "^([\\p{L}\\p{Z}\\p{N}_.:/=+\\-]*)$").
        public let value: String?

        public init(key: String? = nil, value: String? = nil) {
            self.key = key
            self.value = value
        }

        private enum CodingKeys: String, CodingKey {
            case key = "Key"
            case value = "Value"
        }
    }

    public struct TagListMessage: AWSDecodableShape {
        public struct _TagListEncoding: ArrayCoderProperties { public static let member = "Tag" }

        /// A list of one or more tags.
        @OptionalCustomCoding<ArrayCoder<_TagListEncoding, Tag>>
        public var tagList: [Tag]?

        public init(tagList: [Tag]? = nil) {
            self.tagList = tagList
        }

        private enum CodingKeys: String, CodingKey {
            case tagList = "TagList"
        }
    }

    public struct UpgradeTarget: AWSDecodableShape {
        /// A value that indicates whether the target version is applied to any source DB instances that have AutoMinorVersionUpgrade set to true.
        public let autoUpgrade: Bool?
        /// The version of the database engine that an instance can be upgraded to.
        public let description: String?
        /// The name of the upgrade target database engine.
        public let engine: String?
        /// The version number of the upgrade target database engine.
        public let engineVersion: String?
        /// A value that indicates whether a database engine is upgraded to a major version.
        public let isMajorVersionUpgrade: Bool?

        public init(autoUpgrade: Bool? = nil, description: String? = nil, engine: String? = nil, engineVersion: String? = nil, isMajorVersionUpgrade: Bool? = nil) {
            self.autoUpgrade = autoUpgrade
            self.description = description
            self.engine = engine
            self.engineVersion = engineVersion
            self.isMajorVersionUpgrade = isMajorVersionUpgrade
        }

        private enum CodingKeys: String, CodingKey {
            case autoUpgrade = "AutoUpgrade"
            case description = "Description"
            case engine = "Engine"
            case engineVersion = "EngineVersion"
            case isMajorVersionUpgrade = "IsMajorVersionUpgrade"
        }
    }

    public struct VpcSecurityGroupMembership: AWSDecodableShape {
        /// The status of the VPC security group.
        public let status: String?
        /// The name of the VPC security group.
        public let vpcSecurityGroupId: String?

        public init(status: String? = nil, vpcSecurityGroupId: String? = nil) {
            self.status = status
            self.vpcSecurityGroupId = vpcSecurityGroupId
        }

        private enum CodingKeys: String, CodingKey {
            case status = "Status"
            case vpcSecurityGroupId = "VpcSecurityGroupId"
        }
    }
}

// MARK: - Errors

/// Error enum for DocDB
public struct DocDBErrorType: AWSErrorType {
    enum Code: String {
        case authorizationNotFoundFault = "AuthorizationNotFound"
        case certificateNotFoundFault = "CertificateNotFound"
        case dbClusterAlreadyExistsFault = "DBClusterAlreadyExistsFault"
        case dbClusterNotFoundFault = "DBClusterNotFoundFault"
        case dbClusterParameterGroupNotFoundFault = "DBClusterParameterGroupNotFound"
        case dbClusterQuotaExceededFault = "DBClusterQuotaExceededFault"
        case dbClusterSnapshotAlreadyExistsFault = "DBClusterSnapshotAlreadyExistsFault"
        case dbClusterSnapshotNotFoundFault = "DBClusterSnapshotNotFoundFault"
        case dbInstanceAlreadyExistsFault = "DBInstanceAlreadyExists"
        case dbInstanceNotFoundFault = "DBInstanceNotFound"
        case dbParameterGroupAlreadyExistsFault = "DBParameterGroupAlreadyExists"
        case dbParameterGroupNotFoundFault = "DBParameterGroupNotFound"
        case dbParameterGroupQuotaExceededFault = "DBParameterGroupQuotaExceeded"
        case dbSecurityGroupNotFoundFault = "DBSecurityGroupNotFound"
        case dbSnapshotAlreadyExistsFault = "DBSnapshotAlreadyExists"
        case dbSnapshotNotFoundFault = "DBSnapshotNotFound"
        case dbSubnetGroupAlreadyExistsFault = "DBSubnetGroupAlreadyExists"
        case dbSubnetGroupDoesNotCoverEnoughAZs = "DBSubnetGroupDoesNotCoverEnoughAZs"
        case dbSubnetGroupNotFoundFault = "DBSubnetGroupNotFoundFault"
        case dbSubnetGroupQuotaExceededFault = "DBSubnetGroupQuotaExceeded"
        case dbSubnetQuotaExceededFault = "DBSubnetQuotaExceededFault"
        case dbUpgradeDependencyFailureFault = "DBUpgradeDependencyFailure"
        case eventSubscriptionQuotaExceededFault = "EventSubscriptionQuotaExceeded"
        case globalClusterAlreadyExistsFault = "GlobalClusterAlreadyExistsFault"
        case globalClusterNotFoundFault = "GlobalClusterNotFoundFault"
        case globalClusterQuotaExceededFault = "GlobalClusterQuotaExceededFault"
        case instanceQuotaExceededFault = "InstanceQuotaExceeded"
        case insufficientDBClusterCapacityFault = "InsufficientDBClusterCapacityFault"
        case insufficientDBInstanceCapacityFault = "InsufficientDBInstanceCapacity"
        case insufficientStorageClusterCapacityFault = "InsufficientStorageClusterCapacity"
        case invalidDBClusterSnapshotStateFault = "InvalidDBClusterSnapshotStateFault"
        case invalidDBClusterStateFault = "InvalidDBClusterStateFault"
        case invalidDBInstanceStateFault = "InvalidDBInstanceState"
        case invalidDBParameterGroupStateFault = "InvalidDBParameterGroupState"
        case invalidDBSecurityGroupStateFault = "InvalidDBSecurityGroupState"
        case invalidDBSnapshotStateFault = "InvalidDBSnapshotState"
        case invalidDBSubnetGroupStateFault = "InvalidDBSubnetGroupStateFault"
        case invalidDBSubnetStateFault = "InvalidDBSubnetStateFault"
        case invalidEventSubscriptionStateFault = "InvalidEventSubscriptionState"
        case invalidGlobalClusterStateFault = "InvalidGlobalClusterStateFault"
        case invalidRestoreFault = "InvalidRestoreFault"
        case invalidSubnet = "InvalidSubnet"
        case invalidVPCNetworkStateFault = "InvalidVPCNetworkStateFault"
        case kmsKeyNotAccessibleFault = "KMSKeyNotAccessibleFault"
        case resourceNotFoundFault = "ResourceNotFoundFault"
        case sharedSnapshotQuotaExceededFault = "SharedSnapshotQuotaExceeded"
        case snapshotQuotaExceededFault = "SnapshotQuotaExceeded"
        case snsInvalidTopicFault = "SNSInvalidTopic"
        case snsNoAuthorizationFault = "SNSNoAuthorization"
        case snsTopicArnNotFoundFault = "SNSTopicArnNotFound"
        case sourceNotFoundFault = "SourceNotFound"
        case storageQuotaExceededFault = "StorageQuotaExceeded"
        case storageTypeNotSupportedFault = "StorageTypeNotSupported"
        case subnetAlreadyInUse = "SubnetAlreadyInUse"
        case subscriptionAlreadyExistFault = "SubscriptionAlreadyExist"
        case subscriptionCategoryNotFoundFault = "SubscriptionCategoryNotFound"
        case subscriptionNotFoundFault = "SubscriptionNotFound"
    }

    private let error: Code
    public let context: AWSErrorContext?

    /// initialize DocDB
    public init?(errorCode: String, context: AWSErrorContext) {
        guard let error = Code(rawValue: errorCode) else { return nil }
        self.error = error
        self.context = context
    }

    internal init(_ error: Code) {
        self.error = error
        self.context = nil
    }

    /// return error code string
    public var errorCode: String { self.error.rawValue }

    /// The specified CIDR IP or Amazon EC2 security group isn&#39;t authorized for the specified security group. Amazon DocumentDB also might not be authorized to perform necessary actions on your behalf using IAM.
    public static var authorizationNotFoundFault: Self { .init(.authorizationNotFoundFault) }
    ///  CertificateIdentifier doesn&#39;t refer to an existing certificate.
    public static var certificateNotFoundFault: Self { .init(.certificateNotFoundFault) }
    /// You already have a cluster with the given identifier.
    public static var dbClusterAlreadyExistsFault: Self { .init(.dbClusterAlreadyExistsFault) }
    ///  DBClusterIdentifier doesn&#39;t refer to an existing cluster.
    public static var dbClusterNotFoundFault: Self { .init(.dbClusterNotFoundFault) }
    ///  DBClusterParameterGroupName doesn&#39;t refer to an existing cluster parameter group.
    public static var dbClusterParameterGroupNotFoundFault: Self { .init(.dbClusterParameterGroupNotFoundFault) }
    /// The cluster can&#39;t be created because you have reached the maximum allowed quota of clusters.
    public static var dbClusterQuotaExceededFault: Self { .init(.dbClusterQuotaExceededFault) }
    /// You already have a cluster snapshot with the given identifier.
    public static var dbClusterSnapshotAlreadyExistsFault: Self { .init(.dbClusterSnapshotAlreadyExistsFault) }
    ///  DBClusterSnapshotIdentifier doesn&#39;t refer to an existing cluster snapshot.
    public static var dbClusterSnapshotNotFoundFault: Self { .init(.dbClusterSnapshotNotFoundFault) }
    /// You already have a instance with the given identifier.
    public static var dbInstanceAlreadyExistsFault: Self { .init(.dbInstanceAlreadyExistsFault) }
    ///  DBInstanceIdentifier doesn&#39;t refer to an existing instance.
    public static var dbInstanceNotFoundFault: Self { .init(.dbInstanceNotFoundFault) }
    /// A parameter group with the same name already exists.
    public static var dbParameterGroupAlreadyExistsFault: Self { .init(.dbParameterGroupAlreadyExistsFault) }
    ///  DBParameterGroupName doesn&#39;t refer to an existing parameter group.
    public static var dbParameterGroupNotFoundFault: Self { .init(.dbParameterGroupNotFoundFault) }
    /// This request would cause you to exceed the allowed number of parameter groups.
    public static var dbParameterGroupQuotaExceededFault: Self { .init(.dbParameterGroupQuotaExceededFault) }
    ///  DBSecurityGroupName doesn&#39;t refer to an existing security group.
    public static var dbSecurityGroupNotFoundFault: Self { .init(.dbSecurityGroupNotFoundFault) }
    ///  DBSnapshotIdentifier is already being used by an existing snapshot.
    public static var dbSnapshotAlreadyExistsFault: Self { .init(.dbSnapshotAlreadyExistsFault) }
    ///  DBSnapshotIdentifier doesn&#39;t refer to an existing snapshot.
    public static var dbSnapshotNotFoundFault: Self { .init(.dbSnapshotNotFoundFault) }
    ///  DBSubnetGroupName is already being used by an existing subnet group.
    public static var dbSubnetGroupAlreadyExistsFault: Self { .init(.dbSubnetGroupAlreadyExistsFault) }
    /// Subnets in the subnet group should cover at least two Availability Zones unless there is only one Availability Zone.
    public static var dbSubnetGroupDoesNotCoverEnoughAZs: Self { .init(.dbSubnetGroupDoesNotCoverEnoughAZs) }
    ///  DBSubnetGroupName doesn&#39;t refer to an existing subnet group.
    public static var dbSubnetGroupNotFoundFault: Self { .init(.dbSubnetGroupNotFoundFault) }
    /// The request would cause you to exceed the allowed number of subnet groups.
    public static var dbSubnetGroupQuotaExceededFault: Self { .init(.dbSubnetGroupQuotaExceededFault) }
    /// The request would cause you to exceed the allowed number of subnets in a subnet group.
    public static var dbSubnetQuotaExceededFault: Self { .init(.dbSubnetQuotaExceededFault) }
    /// The upgrade failed because a resource that the depends on can&#39;t be modified.
    public static var dbUpgradeDependencyFailureFault: Self { .init(.dbUpgradeDependencyFailureFault) }
    /// You have reached the maximum number of event subscriptions.
    public static var eventSubscriptionQuotaExceededFault: Self { .init(.eventSubscriptionQuotaExceededFault) }
    /// The GlobalClusterIdentifier already exists. Choose a new global cluster identifier (unique name) to create a new global cluster.
    public static var globalClusterAlreadyExistsFault: Self { .init(.globalClusterAlreadyExistsFault) }
    /// The GlobalClusterIdentifier doesn&#39;t refer to an existing global cluster.
    public static var globalClusterNotFoundFault: Self { .init(.globalClusterNotFoundFault) }
    /// The number of global  clusters for this account is already at the maximum allowed.
    public static var globalClusterQuotaExceededFault: Self { .init(.globalClusterQuotaExceededFault) }
    /// The request would cause you to exceed the allowed number of instances.
    public static var instanceQuotaExceededFault: Self { .init(.instanceQuotaExceededFault) }
    /// The cluster doesn&#39;t have enough capacity for the current operation.
    public static var insufficientDBClusterCapacityFault: Self { .init(.insufficientDBClusterCapacityFault) }
    /// The specified instance class isn&#39;t available in the specified Availability Zone.
    public static var insufficientDBInstanceCapacityFault: Self { .init(.insufficientDBInstanceCapacityFault) }
    /// There is not enough storage available for the current action. You might be able to resolve this error by updating your subnet group to use different Availability Zones that have more storage available.
    public static var insufficientStorageClusterCapacityFault: Self { .init(.insufficientStorageClusterCapacityFault) }
    /// The provided value isn&#39;t a valid cluster snapshot state.
    public static var invalidDBClusterSnapshotStateFault: Self { .init(.invalidDBClusterSnapshotStateFault) }
    /// The cluster isn&#39;t in a valid state.
    public static var invalidDBClusterStateFault: Self { .init(.invalidDBClusterStateFault) }
    ///  The specified instance isn&#39;t in the available state.
    public static var invalidDBInstanceStateFault: Self { .init(.invalidDBInstanceStateFault) }
    /// The parameter group is in use, or it is in a state that is not valid. If you are trying to delete the parameter group, you can&#39;t delete it when the parameter group is in this state.
    public static var invalidDBParameterGroupStateFault: Self { .init(.invalidDBParameterGroupStateFault) }
    /// The state of the security group doesn&#39;t allow deletion.
    public static var invalidDBSecurityGroupStateFault: Self { .init(.invalidDBSecurityGroupStateFault) }
    /// The state of the snapshot doesn&#39;t allow deletion.
    public static var invalidDBSnapshotStateFault: Self { .init(.invalidDBSnapshotStateFault) }
    /// The subnet group can&#39;t be deleted because it&#39;s in use.
    public static var invalidDBSubnetGroupStateFault: Self { .init(.invalidDBSubnetGroupStateFault) }
    ///  The subnet isn&#39;t in the available state.
    public static var invalidDBSubnetStateFault: Self { .init(.invalidDBSubnetStateFault) }
    /// Someone else might be modifying a subscription. Wait a few seconds, and try again.
    public static var invalidEventSubscriptionStateFault: Self { .init(.invalidEventSubscriptionStateFault) }
    /// The requested operation can&#39;t be performed while the cluster is in this state.
    public static var invalidGlobalClusterStateFault: Self { .init(.invalidGlobalClusterStateFault) }
    /// You cannot restore from a virtual private cloud (VPC) backup to a non-VPC DB instance.
    public static var invalidRestoreFault: Self { .init(.invalidRestoreFault) }
    /// The requested subnet is not valid, or multiple subnets were requested that are not all in a common virtual private cloud (VPC).
    public static var invalidSubnet: Self { .init(.invalidSubnet) }
    /// The subnet group doesn&#39;t cover all Availability Zones after it is created because of changes that were made.
    public static var invalidVPCNetworkStateFault: Self { .init(.invalidVPCNetworkStateFault) }
    /// An error occurred when accessing an KMS key.
    public static var kmsKeyNotAccessibleFault: Self { .init(.kmsKeyNotAccessibleFault) }
    /// The specified resource ID was not found.
    public static var resourceNotFoundFault: Self { .init(.resourceNotFoundFault) }
    /// You have exceeded the maximum number of accounts that you can share a manual DB snapshot with.
    public static var sharedSnapshotQuotaExceededFault: Self { .init(.sharedSnapshotQuotaExceededFault) }
    /// The request would cause you to exceed the allowed number of snapshots.
    public static var snapshotQuotaExceededFault: Self { .init(.snapshotQuotaExceededFault) }
    /// Amazon SNS has responded that there is a problem with the specified topic.
    public static var snsInvalidTopicFault: Self { .init(.snsInvalidTopicFault) }
    /// You do not have permission to publish to the SNS topic Amazon Resource Name (ARN).
    public static var snsNoAuthorizationFault: Self { .init(.snsNoAuthorizationFault) }
    /// The SNS topic Amazon Resource Name (ARN) does not exist.
    public static var snsTopicArnNotFoundFault: Self { .init(.snsTopicArnNotFoundFault) }
    /// The requested source could not be found.
    public static var sourceNotFoundFault: Self { .init(.sourceNotFoundFault) }
    /// The request would cause you to exceed the allowed amount of storage available across all instances.
    public static var storageQuotaExceededFault: Self { .init(.storageQuotaExceededFault) }
    /// Storage of the specified StorageType can&#39;t be associated with the DB instance.
    public static var storageTypeNotSupportedFault: Self { .init(.storageTypeNotSupportedFault) }
    /// The subnet is already in use in the Availability Zone.
    public static var subnetAlreadyInUse: Self { .init(.subnetAlreadyInUse) }
    /// The provided subscription name already exists.
    public static var subscriptionAlreadyExistFault: Self { .init(.subscriptionAlreadyExistFault) }
    /// The provided category does not exist.
    public static var subscriptionCategoryNotFoundFault: Self { .init(.subscriptionCategoryNotFoundFault) }
    /// The subscription name does not exist.
    public static var subscriptionNotFoundFault: Self { .init(.subscriptionNotFoundFault) }
}

extension DocDBErrorType: Equatable {
    public static func == (lhs: DocDBErrorType, rhs: DocDBErrorType) -> Bool {
        lhs.error == rhs.error
    }
}

extension DocDBErrorType: CustomStringConvertible {
    public var description: String {
        return "\(self.error.rawValue): \(self.message ?? "")"
    }
}
